You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB中Jacobian求解特定非线性方程组失效问题

问题:MATLAB自定义牛顿拉夫逊法求解非线性方程组报错排查与解决

问题背景

需要求解的非线性方程组:

  1. $x_1^3 - x_1^2 \cdot x_2 = -12$
  2. $2 \cdot x_1^2 + 3 \cdot x_1 - x_2 = 9$

自定义牛顿拉夫逊法函数NewRaph2后,调用脚本Point1_Q3运行时触发错误:

Unrecognized function or variable 'x2'.
Error in @(x1,~)3*(x1^2)-(2*x1*x2)
Error in NewRaph2 (line 19)
jacobien=F11(x1i,x2i)*F22(x1i,x2i)-F21(x1i,x2i)*F12(x1i,x2i);

错误原因分析

错误根源在偏导数匿名函数的参数定义:

  • F11是$F_1$对$x_1$的偏导数,表达式需要用到$x_1$和$x_2$,但定义时用@(x1,~)忽略了第二个参数,导致函数内部无法识别x2变量。
  • F12是$F_1$对$x_2$的偏导数,表达式需要用到$x_1$,但定义时用@(~,x2)未将$x_1$纳入参数列表,函数内部无法引用x1变量。

所有偏导数函数必须接收两个参数(即使某个参数在表达式中不使用,也需保留参数位置),不能忽略参数后又在函数内部引用该参数。

解决方法

修正偏导数匿名函数的参数定义,确保每个函数都接收x1和x2作为参数,正确引用传入的变量:

  • 对于需要用到的参数,直接在函数内部使用;
  • 对于不需要的参数,用~占位,但不能引用被忽略的参数。

修正后的代码

调用脚本Point1_Q3修正版

F1=@(x1,x2) 12+(x1^3)-(x1^2)*(x2);
F2=@(x1,x2) -9+2*(x1^2)+3*(x1)-(x2);
% 修正偏导数函数:保留两个参数,正确引用传入变量
F11=@(x1,x2) 3*(x1^2)-(2*x1*x2);  % F1对x1的偏导,需x1和x2
F22=@(x1,x2) -1;                  % F2对x2的偏导,参数占位即可
F12=@(x1,x2) -1*(x1^2);           % F1对x2的偏导,需x1
F21=@(x1,x2) 4*(x1)+3;            % F2对x1的偏导,参数占位即可

% 可选:调整初始值以收敛到正确解(x1=2, x2=5)
x1i=1.8;
x2i=4.8;
% 原初始值会收敛到不符合第一个方程的点(-3, 0),需注意初始值对牛顿法的影响
% x1i=-2.84;
% x2i=-1.36;

Err=0.00001;
iter=100;
[xsol1,xsol2]=NewRaph2(F1,F2,F11,F22,F12,F21,x1i,x2i,iter,Err)

自定义函数NewRaph2(无需修改)

function [xsol1,xsol2] =NewRaph2(F1,F2,F11,F22,F12,F21,x1i,x2i,iter,Err)
%Cette fonction sert à résoudre le système d’équations non-linéaires
%Inputs: %F1: first equation
%F2: second equation
%F11 : derivative F1(x1)
%F22 : derivative F2(x2)
%F12 : derivative F1(x2)
%F21 : derivative F2(x1)
%x1i : initial value of x1
%x2i : initial value of x2
%iter : n iteration
%Err : error rel
%xsol1 : value of x1
%xsol2 : value of x2

for i=1:iter;
jacobien=F11(x1i,x2i)*F22(x1i,x2i)-F21(x1i,x2i)*F12(x1i,x2i);
x1delt=(-F1(x1i,x2i)*F22(x1i,x2i)+F2(x1i,x2i)*F12(x1i,x2i))/jacobien;
x2delt=(-F2(x1i,x2i)*F11(x1i,x2i)+F1(x1i,x2i)*F21(x1i,x2i))/jacobien;
x11=x1i+x1delt;
x21=x2i+x2delt;
Errx1=abs((x11-x1i)/x1i);
Errx2=abs((x21-x2i)/x2i);
if Errx1<Err && Errx2<Err
xsol1=x11;
xsol2=x21;
break
else
x1i=x11;
x2i=x21;
end
end
end

运行结果

使用修正后的初始值x1i=1.8、x2i=4.8,运行后得到符合方程组的解:

xsol1 = 2.0000
xsol2 = 5.0000

验证:

  1. 代入第一个方程:$2^3 - 2^2 \cdot 5 = 8 - 20 = -12$,符合要求;
  2. 代入第二个方程:$2 \cdot 2^2 + 3 \cdot 2 - 5 = 8 + 6 - 5 = 9$,符合要求。

内容的提问来源于stack exchange,提问作者WillPleau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:57:22