2014-12-22 4 views
0

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

ответ

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 или еще чего-нибудь.

0

Для такого простого случая подход, который вы предлагаете, вполне уместен.

«Медленный» процесс может потребовать порядка 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.

 Смежные вопросы

  • Нет связанных вопросов^_^