Octave求解二元非线性方程 fsolve仅返回初始猜测值如何解决
问题原因及解决方法
1 为什么返回初始猜测值
你选择的初始值[1,-1]本身就是方程组的有效解,代入验证完全满足等于0的求解条件:
- 第一个方程:
-1 + 2*(1)^3 + (-1) = 0 - 第二个方程:
-1 - (-1) = 0
因此fsolve直接判定收敛,返回该值,并非求解失败。
2 修正数值求解代码
你代码中加载的symbolic包和定义的符号变量没有实际作用,可以删除。如果需要确认求解状态,可以增加输出参数查看收敛结果和残差值:
function f = fax(x) f(1) = -x(1) + 2*x(1)^3 + x(2); f(2) = -x(1) - x(2); endfunction % 输出参数说明:x是解,fval是残差,info>0代表求解成功 [x, fval, info] = fsolve(@fax, [1,-1])
运行后info返回正值、fval接近0,即可确认求解有效。
3 查找其他解
该方程组总共有3组解析解:
[0, 0][1, -1][-1, 1]
fsolve作为数值求解工具,只会收敛到初始值附近的解,如果需要获取其他解,更换对应的初始猜测值即可,比如要获取[-1, 1],可以将初始值设置为[-1, 2]。
4 一次性获取所有解析解
你代码中已经加载了符号计算包,可以直接用符号求解方法一次性拿到全部解,不需要依赖数值迭代:
pkg load symbolic syms x1 x2 % 定义两个方程 eq1 = -x1 + 2*x1^3 + x2 == 0; eq2 = -x1 - x2 == 0; % 求解 sol = solve([eq1, eq2], [x1, x2]); % 输出所有解 disp('x1的所有解:') disp(sol.x1) disp('x2的所有解:') disp(sol.x2)
内容的提问来源于stack exchange,提问作者wanderer16
相关产品推荐
相关产品推荐

