MATLAB中Jacobian求解特定非线性方程组失效问题
问题:MATLAB自定义牛顿拉夫逊法求解非线性方程组报错排查与解决
问题背景
需要求解的非线性方程组:
- $x_1^3 - x_1^2 \cdot x_2 = -12$
- $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
验证:
- 代入第一个方程:$2^3 - 2^2 \cdot 5 = 8 - 20 = -12$,符合要求;
- 代入第二个方程:$2 \cdot 2^2 + 3 \cdot 2 - 5 = 8 + 6 - 5 = 9$,符合要求。
内容的提问来源于stack exchange,提问作者WillPleau
相关产品推荐
相关产品推荐

