ReleaseHoldВсе в Wolfram Mathematica? - PullRequest
1 голос
/ 31 января 2012

Я хочу присвоить значения переменным (например, c для скорости света или G для гравитационной постоянной), но формулы рассчитаны символически до последнего шага.

Как сделать это кратчайшим путем?

Заменить очень долго и дублирует, в то время как HoldForm может потребовать несколько RealeaseHold, если вложено.

Есть ли другие функции для этого?

Ответы [ 5 ]

3 голосов
/ 02 февраля 2012

Мы можем определить N значения для наших констант.Например:

N[c] = 299792458;

Это определяет числовое значение для c.Мы можем определить функцию, которая использует константу:

f[v_] := Sqrt[1-v^2/c^2]

Когда мы оцениваем эту функцию нормально, она оставляет c в символической форме:

In[11]:= f[200000000]

Out[11]= Sqrt[1 - 40000000000000000/c^2]

Но если мы применяем N, тогда c оценивается численно:

In[12]:= f[200000000] // N

Out[12]= 0.744943
2 голосов
/ 31 января 2012

пример поможет. Но если я вас понял, то у вас есть

expr=9 c + 10 gravity

тогда вы можете написать

expr /. {c -> 299792458, gravity -> 9.8}

для оценки символического выражения с новыми значениями для задействованных символов.

Выражение может оставаться символическим все время, и вы можете просто оценить его для различных значений для символов в нем.

1 голос
/ 02 февраля 2012

Что касается функции "ReleaseHoldAll", MapAll (краткая форма //@) отображает функцию на все части выражения.Следовательно, вы можете использовать:

ReleaseHold //@ expr

, где expr - ваше выражение, содержащее Hold, HoldForm и т. Д. На любом уровне.

1 голос
/ 31 января 2012

Я думаю, что этот вопрос состоит из двух частей.

(1) Должны ли мы заставить Mathematica выполнять все вычисления символически. Это (почти всегда) неправильно. Mathematica может делать числа произвольной точности, поэтому мы должны предпочесть сообщить ей точность наших физических констант (когда они превышают $MachinePrecision) и позволить ей выбрать наиболее эффективный способ решения проблемы.

(2) Как мы печатаем промежуточные шаги в символической форме. Для этого используйте HoldForm[expr], а затем

expr //. HoldForm[x_]:>ReleaseHold[HoldForm[x]]

должен дать вам результаты оценки, как вы указали.

0 голосов
/ 04 февраля 2012

Иногда встречаются странные атрибуты использования оператора замены в mathematica.Это связано с контекстом, в котором вы его применяете.Вышеприведенный ответ, вероятно, будет работать хорошо, но лично я всегда использую команду Block [{variable = number}, code], которая заставляет переменные действовать как глобальные в скобках блока, но как только оценка выполняется снаружи, переменные остаются необъявленными.

используйте его следующим образом:

Block[{c = 299792458, gravity = 9.0 }, answer = 9 c + 10 gravity ]

дает вывод:

2.69813*10^9

, а также устанавливает глобальный ответ на значение вывода, чтобы вы могли использовать его после:

answer/2

Результат:

1.34907*10^9
...