2014-11-04 54 views
3

我有一個函數f被定義爲:爲什麼isequaln(f,簡化(f))是錯誤的?

syms c a t 
f = symfun(c + t - (2*(t - 2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t), [c a t]) 

然而,檢查與簡化版產量平等:

isequaln(f, simplify(f)) 

ans = 

    0 

simplify預計不會回到原來的功能完全等效?

回答

3

isequaln

sym/isequaln這個問題可能是沒有相應的功能,用它來測試平等。從sym/isequaln

isequaln(A,B)返回true如果A和B是相同的處理NaNs相等。

正如@ Benoit_11暗示,該文件並不完全清楚,但是,喜歡它的數字等效,功能似乎是爲測試equality, not identity(儘管遺憾地使用了這個詞「相同」的)。簡化函數是非簡化函數的標識,但它不是等價的。根據文檔,sym/isequaln可能會考慮諸如assumptions以及可能的簡單關係,但不會在內部執行轉換和簡化。這幾乎可以肯定,因爲簡化是一個計算成本高昂的過程,所以很可能只是一個設計決策,只包括一些定義明確(但沒有很好記錄)的測試。

與陷阱

所以可能的解決方案,你怎麼處理?除了sym/isequaln的符號數學工具箱包括isAlways測試平等和和不平等有點更嚴格:

syms c a t 
f = symfun(c + t - (2*(t - 2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t), [c a t]) 
g = simplify(f) 
isAlways(f==g) 

然而,在R2014b這個返回false及以下警告:

Warning: Cannot prove 'c + t - ((2*t - 2*2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t) == c + 
2^(1/2)*(a*t)^(1/2)'. 
> In /Applications/MATLAB_R2014b.app/toolbox/symbolic/symbolic/symengine.p>symengine at 56 
    In sym.isAlways at 38 

你應該請注意,假定符號變量默認情況下是複雜的,並且isAlways正試圖證明的所有可能組合的這種關係c,at。簡化也是一個不明確的過程 - 從文檔simplify

簡化數學表達式不是一個明確定義的主題。關於哪種形式的表達最簡單,沒有普遍的想法。對於一個問題來說最簡單的數學表達式的形式可能很複雜,或者甚至不適用於另一個問題。

如果仔細觀察原始公式,您會發現它包含一個已被簡化的奇點。在R2014b,評估g(1,1,2)回報3,但評估f(1,1,2)回報:

Error using mupadmex 
Error in MuPAD command: Division by zero. [_power] 
    Evaluating: _symans_32_15992 

... 

使用的假設

如果你知道一些關於你的符號變量,您可以通過應用的假設,例如爲了避免這種

syms c a t 
f = symfun(c + t - (2*(t - 2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t), [c a t]) 
g = simplify(f) 
assume(t>2*a) 
isAlways(f==g) 

現在返回true。順便說一句,使用@ Benoit_11的例子,syms a b; isAlways((a+b)^2==a^2+2*a*b+b^2)也直接返回true

+1

+1很好的答案!比我好得多,在解釋我不能做的事情方面做得很好:) – 2014-11-04 19:35:21

2

函數簡化返回您提供的函數的最簡單的代數形式。據Matlab的文檔:

isequaln遞歸比較符號數據結構 的內容和對象的屬性。如果各個 位置中的所有內容均相等,則isequaln返回邏輯1(真)。

它的晦澀難懂我Matlab的如何檢查「在相應位置中的內容」,但看起來雖然簡單的功能是代數相當於原來,它的「內容」是不是在同一位置比原來的所以Matlab認爲它們是不同的。

作爲@horchler在評論理所當然mentionned,測試2層的功能平等與一組輸入參數是幾乎沒有一個堅實的證據,如以下,所以採取此答案與一粒鹽:

%//Define f and S = simplify(f); 
syms c a t 
f = symfun(c + t - (2*(t - 2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t), [c a t]) 

f(c, a, t) = 

c + t - ((2*t - 2*2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t) 

S = simplify(f) 

S(c, a, t) = 

c + 2^(1/2)*(a*t)^(1/2) 

%// Check with dummy arguments: 

isequaln(f(1,2,3),S(1,2,3)) 

ans = 

    1 %// seems to work... 

出於好奇,如果我們比較兩個功能,即(A + b)^ 2和^ 2 + 2AB + b^2(這是相同的),並檢查是否相等:

syms a b 
x1 = symfun(a^2+2*a*b+b^2,[a b]) 

x1(a, b) = 

a^2 + 2*a*b + b^2 

x2 = symfun((a+b)^2,[a b]) 

x2(a, b) = 

(a + b)^2 

isequaln(x1,x2) 

ans = 

    0 

我們得到錯誤的再次,儘管它們是相同的。

因此要回答這個問題'爲什麼isequaln(f,簡化(f))是錯誤的?'我想說這是因爲MATLAB在內部以不同的方式組織它們的內容,所以它們看起來像2個不同的功能。我知道這不是一個很好的解釋,但無論如何,我希望這有幫助。

+0

通過在一點評估來檢驗平等幾乎不構成證明。另外,正在使用重載的'sym/isequaln',而不是'isequaln' - 沒有進行數字比較。我不認爲這回答了這個問題。爲什麼'isequaln'不會返回true和/或兩個函數的平等怎樣被測試? – horchler 2014-11-04 18:17:54

+0

你有一個有效的點我會編輯我的答案 – 2014-11-04 18:27:07