我想給變量賦值(比如c代表光的速度,G代表引力常數),但有符號計算的公式,直到最後一步。ReleaseHoldAll在Wolfram Mathematica中?
怎麼可能以最短的方式做到這一點?
替換是非常長和重複,而如果嵌套,HoldForm可能需要多個RealeaseHold。
是否還有其他一些功能?
我想給變量賦值(比如c代表光的速度,G代表引力常數),但有符號計算的公式,直到最後一步。ReleaseHoldAll在Wolfram Mathematica中?
怎麼可能以最短的方式做到這一點?
替換是非常長和重複,而如果嵌套,HoldForm可能需要多個RealeaseHold。
是否還有其他一些功能?
我們可以爲我們的常量定義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
這太好了。是否有可能使N的行爲表現爲與數字相同的行爲,例如,如果在'2/34.0'中已經存在公式中已經存在的未知事件,停止保存精確值? – 2012-02-02 08:11:29
@SuzanCioc你可以給一個表達式的例子,你希望根據不精確數字的存在而改變它的值嗎?你是否認爲'3 c'會保持不變,但是3.0 c會評估爲'8.99377 *^8'? – WReach 2012-02-02 16:59:28
一個例子會有所幫助。但是,如果我理解你,那麼你有
expr=9 c + 10 gravity
,那麼你可以寫
expr /. {c -> 299792458, gravity -> 9.8}
評估與所涉及的新的符號價值的符號表達。
該表達式可以始終保持符號狀態,您可以簡單地評估其中的符號的不同值。
是的,這就是我現在正在做的。但我希望這可以通過其他方式來完成,例如使用'// N'功能。 – 2012-01-31 14:56:48
我覺得這個問題有兩個部分。 (1)是否應該強制Mathematica象徵性地進行所有計算。這是(幾乎總是)錯誤的。 Mathematica可以執行任意的精確數值,因此我們應該更願意告訴它我們的物理常數的精度(當它們超過$MachinePrecision
時),並讓它選擇最有效的方法來解決問題。 (2)我們如何以符號形式打印中間步驟?對於這一點,使用HoldForm[expr]
,然後
expr //. HoldForm[x_]:>ReleaseHold[HoldForm[x]]
應該給你的評估結果爲你指明。
關於一個 「ReleaseHoldAll」 功能,MapAll
(短形式//@
)將函數映射到表達式的所有部分。因此,你可以使用:
ReleaseHold //@ expr
其中expr
是包含Hold
,HoldForm
,等你的表情,在任何級別。
有時在數學中使用替換運算符有一些奇怪的屬性。這與你應用它的環境有關。上面的答案可能會奏效,但我個人總是使用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
您可能有興趣知道[僅用於Mathematica的新的StackExchange站點](http://mathematica.stackexchange.com/)。在兩個StackExchange站點中發佈相同的問題並不是一種好的形式,但可以隨時在那裏發佈未來的問題。 – Verbeia 2012-01-31 21:01:47