我一直试图用牛顿法解决这个问题,但它给了我错误。我已多次查找我的代码,但仍然找不到有什么问题。问题是:
我的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
答案 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)
,或者使用它作为matlabFunction
或symfun
将其转换为函数句柄的参数:
gradFun = matlabFunction(J\F,'Vars',[x y z]);
然后在循环中使用:
Xnew = X - gradFun(x0,y0,z0);