在Maxima中,我该如何解决这个等式?

时间:2017-09-01 15:16:54

标签: for-loop matrix geometry equation maxima

在千里马,我怎么能解决这个等式?事实上,我有24个未知值,有很多这样的等式。我如何使用Maxima来解决?

知道未知值:a, b, c, d

eq:[a*c=8,a*d=10,b*c=12,b*d=15,a+b=5,c+d=9];
solve(eq,[a,b,c,d]);

2 个答案:

答案 0 :(得分:1)

有四个未知数,你必须有四个方程式。 忽略一组方程并运行:

sol1: solve([a*c=8,a*d=10,b*c=12,a+b=5],[a,b,c,d]);
              [[a = 2, b = 3, c = 4, d = 5]]

然后,忽略另一组方程式并再次运行:

sol2: solve([a*c=8,a*d=10,b*c=12,c+d=9],[a,b,c,d]);
              [[a = 2, b = 3, c = 4, d = 5]]

如果两个结果相同,那么您的系统是一致的,并且具有解决方案sol1sol2

答案 1 :(得分:0)

如果我没有弄错的话,你的方程就是2级或更大的几个变量中的多项式(其中度数等于变量的最大数量相乘)。你说你有更多的方程而不是未知数。

如果我没有弄错,通常没有确切的解决方案,但你可以通过最小二乘法找到最合适的解决方案。我不知道可能有多少本地最合适的解决方案。您可以在math.stackexchange.com上询问解决方案的数量以及此类方程的其他特征。

这是一种在Maxima中寻找本地最佳解决方案的方法。形成"品质因数"方程式中的表达式(fom),并寻找它的局部最小值。我将使用lbfgs来搜索数值近似值。

(%i3) eq:[a*c=8,a*d=10,b*c=12,b*d=15,a+b=5,c+d=9];
(%o3) [a*c = 8,a*d = 10,b*c = 12,b*d = 15,b+a = 5,d+c = 9]
(%i4) eq0 : map (lambda ([e], lhs(e) - rhs(e)), eq);
(%o4) [a*c-8,a*d-10,b*c-12,b*d-15,b+a-5,d+c-9]
(%i5) eq2 : expand (eq0^2);
(%o5) [a^2*c^2-16*a*c+64,a^2*d^2-20*a*d+100,b^2*c^2-24*b*c+144,
       b^2*d^2-30*b*d+225,b^2+2*a*b-10*b+a^2-10*a+25,
       d^2+2*c*d-18*d+c^2-18*c+81]
(%i6) load (lbfgs);
(%o6) "/usr/local/share/maxima/branch_5_40_base_95_g4c9cbbd/share/lbfgs/lbfgs.mac"

(%i9) fom : apply ("+", eq2);
(%o9) b^2*d^2+a^2*d^2+d^2+2*c*d-30*b*d-20*a*d-18*d+b^2*c^2
             +a^2*c^2+c^2-24*b*c-16*a*c-18*c+b^2+2*a*b-10*b+a^2
             -10*a+639

这里fom只是误差的平方和(即方程的右手边和左手边之间的差异,平方并加起来)。

(%i10) lbfgs (fom, [a, b, c, d], [1, 1, 1, 1]/4, 1e-4, [1, 0]);
*************************************************
  N=    4   NUMBER OF CORRECTIONS=25
       INITIAL VALUES
 F=  6.198906250000000D+02   GNORM=  4.916696680699350D+01
*************************************************

   I  NFN     FUNC                    GNORM                   STEPLENGTH

   1    5     1.029984221465989D+01   3.303822830240210D+01   1.342303790326981D-01  
   2    7     1.858590097968602D+00   7.066597977731433D+00   2.567282877401947D-01  
   3    9     1.707935938873334D+00   7.250276888460332D+00   1.939008057328834D-01  
   4   10     1.071933775239074D+00   3.590373568045903D+00   1.000000000000000D+00  
   5   11     6.984083995048138D-01   2.736311274794537D+00   1.000000000000000D+00  
   6   12     2.756317886006059D-01   2.992718120186393D+00   1.000000000000000D+00  
   7   13     4.947211249555039D-02   2.105297770017910D+00   1.000000000000000D+00  
   8   14     8.047123928918154D-04   2.073845793942183D-01   1.000000000000000D+00  
   9   15     7.401148110375289D-06   2.195111965609954D-02   1.000000000000000D+00  
  10   16     3.129228502984915D-07   4.565302248467960D-03   1.000000000000000D+00  
  11   17     1.750777300912887D-09   4.710495250075657D-04   1.000000000000000D+00  

 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
 IFLAG = 0
(%o10) [a = 2.000003188592,b = 2.999996386563707,
        c = 4.000008973580663,d = 5.00000040529949]

我可以猜测a = 2, b = 3, c = 4, d = 5可能是一个确切的解决方案。我可以验证:

(%i11) subst ([a = 2, b = 3, c = 4, d = 5], fom);
(%o11) 0

在这种情况下,这是令人鼓舞的,但总的来说,我认为在接近近似的情况下,它不会成为一个精确的解决方案。近似解决方案可能是您能做的最好的。