Matlab用牛顿法求非线性系统解

时间:2017-03-17 13:54:31

标签: matlab

我一直试图用牛顿法解决这个问题,但它给了我错误。我已多次查找我的代码,但仍然找不到有什么问题。问题是:

enter image description here

我的matlab代码是:

close all, clear, clc

tolerance = 0.01;
error = 1;
X = [1 1 1]';

while(error>tolerance)
   x = X(1); y = X(2); z = X(3); 
   F = [3*x^2-2*x*y+z^3-3 6*x+3*y^2-2*x*y*z-6 2*x*z+y^2-x*y*z^2-2]';
   J = [6*x-2*y -2*x 3*z^2; 6-2*y*z 6*y-2*x*z -2*x*y; 2*z-y*z^2 2*y-x*z^2 2*x-2*x*y];
   Xnew = X - J\F;
   error = norm(Xnew-X);
   X = Xnew;
end

1 个答案:

答案 0 :(得分:1)

通过让MATLAB为您努力工作,可以避免派生问题。这是您可以使用symbolic variables(如果您有符号工具箱可用):

syms x y z
F = [3*x^2-2*x*y+z^3-3 6*x+3*y^2-2*x*y*z-6 2*x*z+y^2-x*y*z^2-2].';
J = jacobian(F,[x,y,z]);

了解如何以分析方式计算J\F,您只需评估该表达式一次,然后找到f(x,y,z)的一些疯狂表达式,您可以将其保存为function out = gradFun(x,y,z),或者使用它作为matlabFunctionsymfun将其转换为函数句柄的参数:

gradFun = matlabFunction(J\F,'Vars',[x y z]);

然后在循环中使用:

Xnew = X - gradFun(x0,y0,z0);