我一直试图用牛顿方法来解决这个问题,但它给了我错误的答案。我已经查过我的代码很多次了,但仍然找不到哪里出了问题。问题是:
我的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
发布于 2017-03-19 20:04:26
通过让MATLAB为您完成繁重的工作,可以避免与推导有关的问题。这是您可以使用symbolic variables执行的操作(如果您有可用的symbolic工具箱):
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);
https://stackoverflow.com/questions/42859365
复制相似问题