我想开发一个用于求解线性和非线性方程组的桌面应用程序.我想用Matlab来使用C#.我之前从未使用过matlab,但我正在努力学习我的项目.
所以,我正在尝试使用fsolve,并按照fsolve文档中给出的示例进行操作.
function F = myfun(x)
F = [2*x(1) - x(2) - exp(-x(1));
-x(1) + 2*x(2) - exp(-x(2))];
**x0 = [-5; -5]; % Make a starting guess at the solution**
options=optimset('Display','iter'); % Option to display output
[x,fval] = fsolve(@myfun,x0,options) % Call solver
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我不知道起始猜测即x0
我只有n个未知的等式.请指导我做什么以及如何进行.
一些示例方程式:
a * b = 10^-14
(a * d)/c = 10^-6.3
(a * e)/d = 10^-10.3
.
.
.
c+d+e = 2.3 * 10^-3
Run Code Online (Sandbox Code Playgroud)
fsolve
使用数值方法来解决代数方程组 - 你绝对需要初始猜测才能使用fsolve
.如果你要分析求解方程,你需要系统的线性化(如果它是非线性的,并注意这可能会或可能不会给你带来好的结果),你可以使用mldivide
或LU分解或其他一些矩阵分解快速解决系统问题Ax=b
.
您可能会推出自己的有限根寻找方法(黄金分割搜索,抛物线插值等)来解决您需要初步猜测的事实 - 这里的权衡是(a)有界根寻找方法比无界方法花费更长时间这需要初步猜测; (b)您需要确保您的解决方案位于下限和上限之内.
简单地说,没有办法数字地指定一组方程并分析地解决它 - 你应该分析解决系统(这可能是不可能的 - 如果是的话,如果你需要非线性系统工作,我建议使用Mathematica而不是MATLAB没有线性化)或必须满足于指定初始猜测或界限.
在我看到的基于物理动机的基于工程的系统中,零向量通常是一个足够好的猜测,但这不应该是硬编码的 - 如果你想解决任何任意系统,你不应该强迫用户使用它作为初步猜测.