首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用牛顿法求非线性方程组的Matlab解

用牛顿法求非线性方程组的Matlab解
EN

Stack Overflow用户
提问于 2017-03-17 21:54:31
回答 1查看 46关注 0票数 0

我一直试图用牛顿方法来解决这个问题,但它给了我错误的答案。我已经查过我的代码很多次了,但仍然找不到哪里出了问题。问题是:

我的matlab代码是:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-03-19 20:04:26

通过让MATLAB为您完成繁重的工作,可以避免与推导有关的问题。这是您可以使用symbolic variables执行的操作(如果您有可用的symbolic工具箱):

代码语言:javascript
运行
复制
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的参数,以将其转换为函数句柄:

代码语言:javascript
运行
复制
gradFun = matlabFunction(J\F,'Vars',[x y z]);

然后在您的循环中使用:

代码语言:javascript
运行
复制
Xnew = X - gradFun(x0,y0,z0);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42859365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档