我想开发一个用于求解线性和非线性方程组的桌面应用程序。 我想用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
在我的情况下,我不知道起始猜测,即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
答案 0 :(得分:5)
fsolve
使用数值方法来求解代数方程组 - 你绝对需要初步猜测才能使用fsolve
。如果你要分析地求解方程,你需要系统的线性化(如果它是非线性的,并注意这可能会或可能不会给你带来好的结果),你可以使用mldivide
或{{3或者其他一些矩阵分解来快速解决系统Ax=b
。
你可能会推出你自己的有限根寻找方法(黄金分割搜索,抛物线插值等)来解决你需要初步猜测的事实 - 这里的权衡是(a)有限的根寻找方法需要更长的时间比无限制的方法需要初步猜测; (b)你需要确保你的解决方案位于下限和上限之内。
简单地说,没有办法在数字上指定一组方程并在分析上精确地求解 - 你应该分析解决系统(这可能是不可能的 - 如果是的话,如果你需要非线性,我建议Mathematica优于MATLAB系统无需线性化工作)或必须满足于指定初始猜测或界限。
在我见过的基于物理动机的基于工程的系统中,零向量通常是一个足够好的猜测,但这不应该是硬编码的 - 如果你想解决任何任意系统,你不应该强迫用户用这个作为初步猜测。