2015-11-07 173 views
2

在Matlab中使用symfun和匿名函數有什麼區別?哪一個更好,即更快?看來,我可以同時使用符號和實數。matlab symfun vs匿名函數

Here他們討論了內聯函數和匿名函數之間的區別,但沒有提到symfun。

回答

4

MATLAB的基本功能設計用於數值計算,即使用浮點數。默認情況下,MATLAB變量和函數是數字的,這就是爲什麼在你的鏈接討論中只有內聯和匿名函數進行比較的原因。

但是,使用符號數學工具箱可以使用符號表達式和函數。這對解決數學問題非常有用,如精確求解,積分,使用任意精度算術或求解方程。然而,符號引擎被設計爲聰明的,而不是快速的(畢竟,遲早象徵引擎必須執行函數的評估,但是MATLAB是設計爲以有效地解決數值問題)。只要有可能,人們應該更喜歡數值MATLAB函數,特別是那些經常可以擴展到以矢量化方式工作,沿陣列輸入提供數組輸出。當面對一個混合問題(需要符號數學,而且計算結果昂貴的評估)時,最有可能以參數化(符號)方式解決您的初始問題一次,然後使用通過把它變成一個適當的數字函數來得到最後的結果。您應該看看符號數學工具箱的matlabFunction函數,該函數完全執行此操作,並且對於合理縮放的函數(但是here's爲反例)效果很好。

請注意,雖然您可以使用公式定義匿名函數,如[email protected](x) 3*x^2-2,但它實際上會定義一個數字函數,該函數返回給定數字輸入的值,如f(3)。如果您想要計算公式,請使用數字函數。符號數學應該保留用於無法用基本數字特徵精確求解的情況,例如計算多元標量場的精確梯度。

+0

太好了,謝謝!還有一點,匿名函數也可以用於符號表達式,例如'f(a)'給出'3 * a^2 - 2',所以它不是純數字,對嗎?或者爲什麼呢? – vakker

+0

@vakker因爲你必須將'a'定義爲'sym'變量。然後執行'3 * a^2 - 2'作爲符號表達將是有意義的。從這個意義上說,是的,你可以定義一個符號函數。但是從symfun的角度來看,這些並不是真正的象徵功能。考慮包含2個符號參數和2個符號輸入變量的函數f(x,y)= a * x + b * y'。你可以將它定義爲'f1 = symfun(a * x + b * y,[x,y])',並且可以使用'f2 = @(x,y)a * x + b * y' 。乍一看,它們將是相同的,但'argnames(f1)'會給出'[x,y]',而另一個則會引發錯誤。 –

+0

我明白了。感謝澄清。 – vakker