24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2428  |  回复: 1

辛迪熊啦

新虫 (初入文坛)

[求助] 牛顿迭代法接非线性方程组求解已有1人参与

新手,菜鸟
有一组比较复杂的方程组需要求解,含有15个未知数,15个方程,找到一个案例照着编程了一下
运行结果是Warning: Matrix is close to singular or badly scaled. Results may be inaccurate.
RCOND =  1.322942e-30
请问这种现象是由于方程本身有问题, 还是求解算法有问题, 还是初值给的有问题?
如果是算法有问题,还有什么其他算法可以推荐呢
(还有我是新手所以金币不多 如果不满意金币数量我可以后期再多赚金币补偿^-^)

以下是用到的编程案例,我是照着这个案例编程的,把我这15个方程套进去,最后得出了上面的结论
matlab实现牛顿迭代法求解非线性方程组
已知非线性方程组如下
3*x1-cos(x2*x3)-1/2=0
x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0
exp(-x1*x2)+20*x3+(10*pi-3)/3=0
求解要求精度达到0.00001
---------------------------------------------------------分--割--线---------------------------------------------------------
首先建立函数fun
储存方程组编程如下将fun.m保存到工作路径中:
function f=fun(x);
%定义非线性方程组如下
%变量x1 x2 x3
%函数f1 f2 f3
syms x1 x2 x3
f1=3*x1-cos(x2*x3)-1/2;
f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06;
f3=exp(-x1*x2)+20*x3+(10*pi-3)/3;
f=[f1 f2 f3];
---------------------------------------------------------分--割--线---------------------------------------------------------
建立函数dfun
用来求方程组的雅克比矩阵将dfun.m保存到工作路径中:
function df=dfun(x);
%用来求解方程组的雅克比矩阵储存在dfun中
f=fun(x);
df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')];
df=conj(df');
---------------------------------------------------------分--割--线---------------------------------------------------------
编程牛顿法求解非线性方程组将newton.m保存到工作路径中:
function x=newton(x0,eps,N);
con=0;
%其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛
for i=1:N;
    f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)});
    df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)});
    x=x0-f/df;
    for j=1:length(x0);
        il(i,j)=x(j);
    end
    if norm(x-x0)<eps
        con=1;
        break;
    end
    x0=x;
end
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

匿名

用户注销 (文坛精英)

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
辛迪熊啦: 金币+10, 有帮助, 谢谢,我再去查找看看pinv怎么使用:) 2015-02-24 22:42:31
本帖仅楼主可见
2楼2015-02-24 21:44:35
已阅   申请仿真EPI   回复此楼   编辑   查看我的主页
相关版块跳转 我要订阅楼主 辛迪熊啦 的主题更新
信息提示
请填处理意见