使用公式和求解器进行符号计算

时间:2014-12-22 17:51:26

标签: symbolic-math equation-solving

我正在寻找一种编程语言和一种自动化以下问题的方法。 给定一个连接不同变量的公式,比如g = GM / r ^ 2,以及除一个变量之外的所有变量的值(g = 9.8,M = 5E25,G = 6.7E-11),如何编程一个例程: a)识别未知变量 b)象征性地解决公式 c)最后,用已知变量的值代替并解决未知的等式。 我远不是编程方面的专家,而且我想到的唯一一件事就是一个缓慢的过程,其中一个变量检查​​变量后面的变量哪一个尚未设置为一个值,并根据该变量使用公式的适当重新排列计算未知数。 (例如,在我们的例子中,程序在变量之后检查变量,直到它发现r是未知的。然后,它使用相同的公式但准备计算r,即r = sqrt(GM / g)) 我确信有一种快速优雅的语言可以做到这一点,但我无法弄明白。 在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

对于这样一个简单的案例,你提出的方法是非常合适的。

"慢"进程可能需要大约10纳秒才能找到未知变量(使用编译语言),所以我不会那么担心。

实际上,符号计算程序能够导出显式公式,您可以在大多数编程语言中重写

g=GM/r²
G=gr²/M
M=gr²/G
r=√GM/g


// C code
if (g == 0) g= G * M / (r * r);
else if (G == 0) G= g * r * r / M;
else if (M == 0) M= g * r * r / G;
else r= Math.sqrt(G * M / g);

例如,免费的Microsoft Mathematics可以做到。但在这种特殊情况下,只需手动完成即可。

对于具有内置脚本的完全集成的解决方案,请考虑Mathematica,Mathcad,Maple and the like

答案 1 :(得分:0)

嗯,这是一种方法,使用Maxima

eq : g = G * M / r^2;
known_values : [g = 9.8, M = 5e25, G = 6.7e-11];
eq1 : subst (known_values, eq);
remaining_var : listofvars (eq1);
solve (eq1, remaining_var);
  => [r = -5000000*sqrt(670)/7, r = 5000000*sqrt(670)/7]

您可以使用函数float从中获取浮点值。

您也可以使用Sympy或其他内容。