Я ищу язык программирования и способ автоматизировать следующие проблемы. Для формулы, связывающей разные переменные, скажем g = GM/r^2 и значения для всех, кроме одной из переменных, (g = 9.8, M = 5E25, G = 6.7E-11), как я могу запрограммировать рутину который: a) Идентифицирует неизвестную переменную b) символически, решает формулу c), наконец, заменяет значения известных переменных и решает уравнение для неизвестного. Я далек от специалиста по программированию, и единственное, что мне пришло в голову, это медленный процесс, в котором одна проверяет переменную после переменной, которая не была установлена в значение, и в соответствии с этим использует соответствующую перегруппировку формулы для вычисления неизвестного. (например, в нашем случае программа проверяет переменную после переменной до тех пор, пока не найдет, что r неизвестно. Затем она использует ту же формулу, но готова к вычислению r, т. Е. R = sqrt (GM/g)) Я уверен для этого есть быстрый элегантный язык, но я не могу понять это. Заранее благодарим за помощь.Символическое вычисление с формулами и решателем
ответ
Ну, вот один из способов сделать это, используя 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 или еще чего-нибудь.
Для такого простого случая подход, который вы предлагаете, вполне уместен.
«Медленный» процесс может потребовать порядка 10 наносекунд, чтобы найти неизвестную переменную (используя скомпилированный язык), поэтому я бы не стал так беспокоиться.
Действительно символические программы вычисления могут получить явные формулы, которые вы можете retranscript в большинстве языков программирования
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.