我有一个方程组......
dF(a,b,c)/da = 0;
dF(a,b,c)/db = 0;
dF(a,b,c)/dc = 0;
其中a
,b
,c
是未知变量常量,dF/d*
是变量的匿名函数。我必须在优化问题中解决a
,b
和c
问题。当系统简化为一个等式时,我使用Matlab的fzero
来求解变量并且它可以工作。例如
var_a = fzero(@(a) dF(a)/da,0);
在注意到fzero
和fsolve
为某些案例提供了截然不同的答案后,我做了一些搜索。根据我gather,fzero
仅适用于单个变量的单个方程式?所以转向方程组,我想选择最合适的方法。我过去曾使用过Matlab的solve
,但我相信这只是用于符号表达式吗?什么是解决线性匿名函数系统的最佳方法,它们都等于零?
我尝试了以下内容,并取回了结果
vars = fsolve(@(V)[dF(V)/da;dF(V)/db;dF(V)/dc],zeros(1,3));
其中vars
包含所有3个变量,但在阅读上一个link中的示例后,Fsolve
无法找到x ^ 2和x ^ 3的零值。上面给出的系统中的解向量都是零,函数是多项式。把这一切放在一起,我想知道fsolve
是不是最佳选择?
我可以构建一个调用fzero
的系统吗?
vars = [fzero(@(a) dF(a,b,c)/da,0);
fzero(@(b) dF(a,b,c)/db,0);
fzero(@(c) dF(a,b,c)/dc,0)];
我认为不会起作用(每个dF/d*
如何获得其他2个变量输入?)或者它会不会?
有什么想法吗?
答案 0 :(得分:0)
您可以使用'lsqnonlin'以数字方式解决以最小化任何函数。要将其用于方程组,只需将它们转换为带矢量输入的单个函数。像这样:
fToMinimize = @(abc) ...
(dF(ABC(1),ABC(2),ABC(3))/da)^2 +...
(dF(ABC(1),ABC(2),ABC(3))/db)^2 +...
(dF(ABC(1),ABC(2),ABC(3))/dc)^2 ;
abcSolved = lsqnonlin(fToMinimize, [0 0 0])
如果你猜测a,b和c的值,你可以(并且应该)使用那些而不是[0 0 0]向量。 lsqnonlin函数中还有许多选项可用于调整行为。例如,您希望得到的最佳答案有多接近。如果功能表现良好,如果您正在寻找接近完全的答案,那么您应该能够大幅度减小公差。