24小时热门版块排行榜    

查看: 523  |  回复: 0

十甫寸

木虫 (正式写手)

[求助] 拟牛顿法求解非线性方程组——老是出错,跪求大神指点~(或提供一种新的算法)

function [r,m]=mulVNewton(F,x0,A,eps)
%方程组:F
%方程组的初始解:x0
% 初始A矩阵:A
%解的精度:eps
%求得的一组解:r
%迭代步数:m



clear clc
syms x1 x2 x3 f1 f2 f3
D=input('请输入频带的实测数据[q,r,v]:');
q=D(:,1);%第一列
r=D(:,2);
v=D(:,3);

%将实测数据代入方程组中
nn=length(D);
F1=0;F2=0;F3=0;
for i=1:nn
    f1=(v(i)-(x1)*q(i)^(x2)*r(i)^(x3))*q(i)^(x2)*r(i)^(x3);
    f2=(v(i)-(x1)*q(i)^(x2)*r(i)^(x3))*q(i)^(x2)*r(i)^(x3)*log(q(i));
    f3=(v(i)-(x1)*q(i)^(x2)*r(i)^(x3))*q(i)^(x2)*r(i)^(x3)*log(r(i));
    F1=F1+f1;F2=F2+f2;F3=F3+f3;
end
disp('F1=');
disp(F1);
disp('F2=');
disp(F2);
disp('F3=');
disp(F3);

F(1)=F1;F(2)=F2;F(3)=F3;
x=[x1,x2,x3];
x0=[50,0.6,-1.4];
A=[1,0,0; 0,1,0;0,0,1];

if nargin==1
    A=eye(length(x0)); %A取为单位阵
    eps=1.0e-4;
else
   if nargin==2
         eps=1.0e-4;
   end
end

x0 = transpose(x0);
Fx = subs(F, findsym(F),x0);
r=x0-Fx/A;
m=1;
tol=1;
while tol>eps
    x0=r;
    Fx = subs(F, findsym(F),x0);
    r=x0-Fx/A;
    y=r-x0;
    Fr = subs(F, findsym(F),r);
    z= Fr-Fx;
    A1=A+(z-A*y)*transpose(y)/norm(y);                   %调整A
    A=A1;
    m=m+1;
    if(m>100000)                                   %迭代步数控制
        disp('迭代步数太多,可能不收敛!');
        return;
    end
    tol=norm(r-x0);
end

输入数据为[q,r,v]:

[5.6,15.62,1.431
5.6,22.36,1.067
5.6,29.73,0.582
5.6,36.4,0.516
5.6,43.17,0.348
9.4,20.59,1.433
9.4,27.86,0.964
9.4,35.44,0.632
9.4,49.03,0.376
12.8,27.31,1.204
5.6,18.03,1.586
5.6,32.57,0.633
5.6,39.29,0.601
5.6,46.1,0.418
11.6,22.36,1.332
11.6,29.73,0.911
11.6,37.36,0.549
11.6,44.15,0.479
11.6,50.99,0.386]
回复此楼

» 猜你喜欢

奋斗改变命运!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

智能机器人

Robot (super robot)

我们都爱小木虫

相关版块跳转 我要订阅楼主 十甫寸 的主题更新
信息提示
请填处理意见