回 帖 发 新 帖 刷新版面

主题:[讨论]利用牛顿迭代求解非线性方程组问题,麻烦帮忙改一下吧。

我的思路是这样的:输入样本D为一个n乘3的矩阵,其中第一二三列分别表示q、r、v,然后代入方程组;  f1=sum((v(i)-k*q(i)^a*r(i)^b)*q(i)^a*r(i)^b); f2=sum((v(i)-k*q(i)^a*r(i)^b)*q(i)^a*r(i)^b*log(q(i)));f3=sum((v(i)-k*q(i)^a*r(i)^b)*q(i)^a*r(i)^b*log(r(i)));中求解k、a、b并且使(x-x0)/x0误差最小。

下面是编写的程序,请帮忙改正一下吧,谢了。

clear clc
global x v k q a b r e1;
D=[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;12.8,27.31,1.204];%数据样本

q=D(:,1)';
r=D(:,2)';
v=D(:,3)';

%计算输入样本的组数
n=length(q);

x0=[100,0.5,-0.5];%初始值

%编写循环程序
for i=1:n
      if abs(e1)>1e-4&(w<=500)
      f1=sum((v(i)-k(w)*q(i)^a(w)*r(i)^b(w))*q(i)^a(w)*r(i)^b(w));
      f2=sum((v(i)-k(w)*q(i)^a(w)*r(i)^b(w))*q(i)^a(w)*r(i)^b(w)*log(q(i)));
      f3=sum((v(i)-k(w)*q(i)^a(w)*r(i)^b(w))*q(i)^a(w)*r(i)^b(w)*log(r(i)));
     
      f=[f1;f2;f3];x=[k,a,b];
      df=jacobian(f,x);%利用jacobian函数求微分
      x=newton(f,df,x0,e,N);
      x=x0-feval(f,x0)/feval(df,x0);
     
%利用norm函数求精度
      e1=norm((x-x0)./x,inf);%取dx的无穷范数
      
   
      w=w+1;
        x0=x;
        disp(x);
    else if w>N
    warning('已达迭代次数上限');
    end
   i=i+1;
      end
end
disp(x)

回复列表 (共7个回复)

沙发

请将仿真参数“ x v k q a b r w e1 e N”给一下,以便我验证一下

板凳


我在过程中都给出了,e是精度1e-4,N为500,其他的都有了。麻烦了,谢谢!

3 楼

我按以下验算,没有错误,但没有结果。

clear; 
clc;
e=1e-4;
N=500;
global x v k q a b r w e1 e N;
D=[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;12.8,27.31,1.204];%数据样本

q=D(:,1)';
r=D(:,2)';
v=D(:,3)';

%计算输入样本的组数
n=length(q);

x0=[100,0.5,-0.5];%初始值

%编写循环程序
for i=1:n
      if abs(e1)>1e-4&(w<=500)
      f1=sum((v(i)-k(w)*q(i)^a(w)*r(i)^b(w))*q(i)^a(w)*r(i)^b(w));
      f2=sum((v(i)-k(w)*q(i)^a(w)*r(i)^b(w))*q(i)^a(w)*r(i)^b(w)*log(q(i)));
      f3=sum((v(i)-k(w)*q(i)^a(w)*r(i)^b(w))*q(i)^a(w)*r(i)^b(w)*log(r(i)));
     
      f=[f1;f2;f3];
      x=[k,a,b];
      df=jacobian(f,x);%利用jacobian函数求微分
      x=newton(f,df,x0,e,N);
      x=x0-feval(f,x0)/feval(df,x0);
     
%利用norm函数求精度
      e1=norm((x-x0)./x,inf);%取dx的无穷范数
      
   
      w=w+1;
        x0=x;
        disp(x);
    else if w>N
    warning('已达迭代次数上限');
    end
   i=i+1;
      end
end
x
%disp(x)

结果: 
Warning: The value of local variables may have been changed to match the
         globals.  Future versions of MATLAB will require that you declare
         a variable to be global before you use that variable.
> In fenxianxing at 5
Warning: The value of local variables may have been changed to match the
         globals.  Future versions of MATLAB will require that you declare
         a variable to be global before you use that variable.
> In fenxianxing at 5

x =

     []

4 楼

全局变量没有给我。global x v k q a b r w e1

5 楼


你好,其实我是个初学者,程序里面肯定有很多的错误,至于那里面的全局变量,我是这样假定的:刚开始输入一个数据样本,其中此样本的第一二三列分别为q、r、v,需要求算的是k、a、b,程序里的w为求解次数。麻烦了。

6 楼

我的机子没有newton()库函数,但是没有报错,只有警告。

建议你看一本书,高教社,冯烟利翻译《数值分析》,里面有你类似方程的解例子。但是看了,你的程序结构,应该没有错误。

我无能为力,另请高明解答。

7 楼


谢了

我来回复

您尚未登录,请登录后再回复。点此登录或注册