我有一個函數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
預計不會回到原來的功能完全等效?
我有一個函數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
預計不會回到原來的功能完全等效?
與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
,a
和t
。簡化也是一個不明確的過程 - 從文檔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
。
函數簡化返回您提供的函數的最簡單的代數形式。據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個不同的功能。我知道這不是一個很好的解釋,但無論如何,我希望這有幫助。
通過在一點評估來檢驗平等幾乎不構成證明。另外,正在使用重載的'sym/isequaln',而不是'isequaln' - 沒有進行數字比較。我不認爲這回答了這個問題。爲什麼'isequaln'不會返回true和/或兩個函數的平等怎樣被測試? – horchler 2014-11-04 18:17:54
你有一個有效的點我會編輯我的答案 – 2014-11-04 18:27:07
+1很好的答案!比我好得多,在解釋我不能做的事情方面做得很好:) – 2014-11-04 19:35:21