在千里马,我怎么能解决这个等式?事实上,我有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]);
答案 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]]
如果两个结果相同,那么您的系统是一致的,并且具有解决方案sol1
≡sol2
。
答案 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
在这种情况下,这是令人鼓舞的,但总的来说,我认为在接近近似的情况下,它不会成为一个精确的解决方案。近似解决方案可能是您能做的最好的。