【问题标题】:FSolve simultaneous equations in matrix form with matlab用 matlab 求解矩阵形式的联立方程
【发布时间】:2013-10-19 06:36:04
【问题描述】:

我在 matlab 中看到了几个 fsolve 的示例,但似乎找不到任何显示如何以矩阵形式传递参数的示例。

这是我的代码。

[A,b] = equationsToMatrix(eq1,eq2)

X0 = [0 0]

fsolve([A,b], X0)

这是输出

eq1 = - sx - sy/2 == 5 

eq2 = - (3*sx)/2 - (3*sy)/2 == 9 

A =

[   -1, -1/2]
[ -3/2, -3/2]


b =

 5
 9


X0 =

 0     0

Error using lsqfcnchk (line 109)
If FUN is a MATLAB object, it must have an feval method.

Error in fsolve (line 198)
    funfcn = lsqfcnchk(FUN,'fsolve',length(varargin),funValCheck,gradflag);

Error in SolveTesting (line 70)
fsolve([A,b], X0)

如您所见,我已经得到了一个很好的求解格式的方程组,为什么 matlab 不接受这个?我也不明白 x0 论点的意义。我提供了一个方程组,那我为什么需要一个起点?

【问题讨论】:

  • 您需要提供一个“球场”起点,这样算法就不会被与答案相距甚远而导致的巨大错误所迷惑。第一个参数应该是一个评估函数(它返回离你的答案有多远)。你不能只传递一个矩阵。但是,您可以创建一个匿名函数并将数据包装在其中。
  • 那么 x0 不应该有 4 个变量吗?系统中两个未知数的最小值/最大值?我当然参考了帮助文档,但我不明白。它的例子都直接提供了被评估的方程。我无法对方程式进行硬编码,因为它们来自其他代码的结果。
  • 不,您正在尝试求解 sxsy。这是两个变量。您的评估函数应该通过您的方程运行它们以生成b。然后,您使用c = b - [5 9] 并想出一些能产生单一正值的东西。 例如 sum(c .* c)。那是你的错误。 fsolve 试图最小化这个错误。你不需要那个A 矩阵。如果您想以这种方式解决它,那您就找错地方了。 fsolve 旨在最大限度地减少可能没有 100% 准确解决方案的系统。
  • 什么评价函数?我不明白这是什么意思。方程为矩阵形式。您说 x0 是一个“球场”图形,边界条件,这意味着一个范围。因此,对于要解决的每个未知数,您都需要一个最小值和最大值。进入这个问题,我可以预测一个范围,但我不知道提前多少准确度的答案。

标签: matlab


【解决方案1】:

想通了。这是交易。传递给 fsolve 的对象需要是指向函数的指针。此函数需要评估系统中的每个方程并返回一个矩阵,其中包含每个方程的数值结果。如果所有方程都返回零,则系统已求解。

传递给 fsolve 的函数既可以在单独的脚本中定义,也可以在简单的行中创建。

例如定义:

function f = matrixfun(z,A,b)
    f = double(A) * [z(1);z(2)] + double(b);
end

然后调用:

>> fsolve(@matrixfun,guess,[],A,b)

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>


ans =

4.0000   2.0000

或者你可以这样做:

>> fsolve(@(z)double(A)*[z(1);z(2)]+double(b),[-5 -5])

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>


ans =

 4.0000   2.0000

** 我通过 double() 传递 A 和 b,因为起初我收到一个错误,即 fsolve 希望所有值都作为双精度值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多