使用R

时间:2018-12-14 20:22:49

标签: r solver equation-solving simultaneous

我正在尝试使用R中的Ryacas软件包求解一个由3个方程组成的系统。

library(Ryacas)
 yacas("OldSolve({(f*Reg/(k + Reg)) - r*BB - ab * BB - a1*f1*BB*AA*P - fp*BB*P==0,(ab * BB + a1*f1*BB*AA*P)/e1 - m1 * AA == 0, (fp * BB * P)/ep - f1*AA*P - mp * P ==0 },{BB,AA,P})")

但是我在R中得到以下答案

expression(list(list(BB == BB, AA == (f * Reg/(k + Reg) - r * 
    BB - ab * BB - fp * BB * P)/(P * (a1 * f1 * BB)), P == P)))

但是,如果我在其他软件上求解,我应该得到following answer(太大而无法在stackoverflow上写出来)

基本上是形式

{BB -> some value, AA -> some value, P-> 0}, {BB -> some value, AA -> some value, P-> some value}, 
{BB -> some value, AA -> some value, P-> some value}

1 个答案:

答案 0 :(得分:1)

很难完全证明这一点,但是对于该系统,OldSolve很可能太弱了。

manual中的几个要点:

  

此命令尝试以求解一个或多个方程式。

因此,不能保证。

  

请注意,仅找到并返回了一个解决方案。

这意味着肯定无法获得您提到的所有三个解决方案。

  

再次,返回至多一个解决方案。

您拥有BB == BBP == P的事实意味着有许多解决方案,因此我们可以将其视为解决系统失败的证据。

  

递归地求解多个方程:首先,一个方程是   寻找其中其中一个变量恰好发生一次;然后这个   方程用SuchThat解决;最后的解决方案是   在其他等式中替换,消除了减少数目   方程组加一。这足以满足所有线性方程式和   大类简单非线性方程式

因此,这种解释说明了OldSolve可能在您的系统中失败的原因。首先,它是非线性的,无法保证。其次,每个变量在每个方程式中出现1-4次。如果我正确理解该算法,则在解决一个方程式(例如w.r.t. AA)并将其替换为其他两个方程式之后,我们就完成了。这是因为BBP都在剩余的两个方程式中都出现多次(结果OldSolve无法求解其中的任何一个)。您也可以尝试切换方程式的顺序。您将看到然后可以解决另一个变量。