2012-01-31 78 views
1

我想給變量賦值(比如c代表光的速度,G代表引力常數),但有符號計算的公式,直到最後一步。ReleaseHoldAll在Wolfram Mathematica中?

怎麼可能以最短的方式做到這一點?

替換是非常長和重複,而如果嵌套,HoldForm可能需要多個RealeaseHold。

是否還有其他一些功能?

+0

您可能有興趣知道[僅用於Mathematica的新的StackExchange站點](http://mathematica.stackexchange.com/)。在兩個StackExchange站點中發佈相同的問題並不是一種好的形式,但可以隨時在那裏發佈未來的問題。 – Verbeia 2012-01-31 21:01:47

回答

3

我們可以爲我們的常量定義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 
+0

這太好了。是否有可能使N的行爲表現爲與數字相同的行爲,例如,如果在'2/34.0'中已經存在公式中已經存在的未知事件,停止保存精確值? – 2012-02-02 08:11:29

+0

@SuzanCioc你可以給一個表達式的例子,你希望根據不精確數字的存在而改變它的值嗎?你是否認爲'3 c'會保持不變,但是3.0 c會評估爲'8.99377 *^8'? – WReach 2012-02-02 16:59:28

2

一個例子會有所幫助。但是,如果我理解你,那麼你有

expr=9 c + 10 gravity 

,那麼你可以寫

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

評估與所涉及的新的符號價值的符號表達。

該表達式可以始終保持符號狀態,您可以簡單地評估其中的符號的不同值。

+0

是的,這就是我現在正在做的。但我希望這可以通過其他方式來完成,例如使用'// N'功能。 – 2012-01-31 14:56:48

1

我覺得這個問題有兩個部分。 (1)是否應該強制Mathematica象徵性地進行所有計算。這是(幾乎總是)錯誤的。 Mathematica可以執行任意的精確數值,因此我們應該更願意告訴它我們的物理常數的精度(當它們超過$MachinePrecision時),並讓它選擇最有效的方法來解決問題。 (2)我們如何以符號形式打印中間步驟?對於這一點,使用HoldForm[expr],然後

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

應該給你的評估結果爲你指明。

1

關於一個 「ReleaseHoldAll」 功能,MapAll(短形式//@)將函數映射到表達式的所有部分。因此,你可以使用:

ReleaseHold //@ expr 

其中expr是包含HoldHoldForm,等你的表情,在任何級別。

0

有時在數學中使用替換運算符有一些奇怪的屬性。這與你應用它的環境有關。上面的答案可能會奏效,但我個人總是使用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 
相關問題