как использовать единицы измерения вдоль значений параметров функции в Mathematica - PullRequest
3 голосов
/ 13 сентября 2009

Я бы хотел передать значения параметров в метрах или километрах (оба возможных) и получить результат в метрах / секундах.

Я пытался сделать это в следующем примере:

u = 3.986*10^14 Meter^3/Second^2;
v[r_, a_] := Sqrt[u (2/r - 1/a)];

Convert[r, Meter];

Convert[a, Meter];

Если я пытаюсь использовать определенную функцию и преобразование:

a = 24503 Kilo Meter;
s = 10198.5 Meter/Second;
r = 6620 Kilo  Meter;
Solve[v[r, x] == s, x]

Функция возвращает следующее:

{x -> (3310. Kilo Meter^3)/(Meter^2 - 0.000863701 Kilo Meter^2)}

, который не является удобным форматом.

В любом случае, я хотел бы определить a и r в метрах или километрах и получить результат s в метрах / секундах (Meter / Second).

Я был бы очень благодарен, если бы кто-нибудь из вас мог исправить данное определение функции и другие операторы, чтобы получить желаемый результат.

Ответы [ 2 ]

2 голосов
/ 14 сентября 2009

Вот один из способов сделать это, когда вы используете тот факт, что Solve возвращает список правил для замены значения x на v[r, x], а затем используете Convert, что сделает необходимое упрощениеполученного алгебраического выражения также:

With[{rule = First@Solve[v[r,x]==s,x] 
      (* Solve always returns a list of rules, because algebraic 
         equations may have multiple solutions. *)},
  Convert[v[r,x] /. rule, Meter/Second]]

Это вернет (10198.5 Meter)/Second в качестве вашего ответа.

1 голос
/ 24 сентября 2009

Вам просто нужно сказать Mathematica, чтобы он упростил выражение, предполагая, что единицы являются «возможными», что является причиной того, что он не выполняет упрощения сам. Итак, что-то вроде

SimplifyWithUnits[blabla_, unit_List]:= Simplify[blalba, (#>0)&/@unit];

Так что, если вы получаете эту уродливую вещь, вы просто набираете% ~ SimplifyWithUnits ~ {Meter} или что-то еще.

...