Matlab:解决匿名函数的线性系统

时间:2016-04-23 03:25:41

标签: matlab

我有一个方程组......

dF(a,b,c)/da = 0;
dF(a,b,c)/db = 0;
dF(a,b,c)/dc = 0;

其中abc是未知变量常量,dF/d*是变量的匿名函数。我必须在优化问题中解决abc问题。当系统简化为一个等式时,我使用Matlab的fzero来求解变量并且它可以工作。例如

var_a = fzero(@(a) dF(a)/da,0);

在注意到fzerofsolve为某些案例提供了截然不同的答案后,我做了一些搜索。根据我gatherfzero仅适用于单个变量的单个方程式?所以转向方程组,我想选择最合适的方法。我过去曾使用过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个变量输入?)或者它会不会?

有什么想法吗?

1 个答案:

答案 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函数中还有许多选项可用于调整行为。例如,您希望得到的最佳答案有多接近。如果功能表现良好,如果您正在寻找接近完全的答案,那么您应该能够大幅度减小公差。