簡體   English   中英

如何從MATLAB中的符號表達式創建函數?

[英]How do I make a function from a symbolic expression in MATLAB?

如何從符號表達式中創建函數? 例如,我有以下內容:

syms beta
n1,n2,m,aa= Constants
u = sqrt(n2-beta^2);
w = sqrt(beta^2-n1);
a = tan(u)/w+tanh(w)/u;
b = tanh(u)/w;
f = (a+b)*cos(aa*u+m*pi)+a-b*sin(aa*u+m*pi);  %# The main expression

如果我想在特殊程序中使用f來查找它的零,我該如何將f轉換為函數? 或者,我該怎么做才能找到f和這樣的嵌套表達式的零?

你有幾個選擇......

選項#1:自動生成一個功能

如果您有符號工具箱的 4.9(R2007b +)或更高版本 ,您可以使用matlabFunction函數將符號表達式轉換為匿名函數或函數M文件。 文檔中的一個示例:

>> syms x y
>> r = sqrt(x^2 + y^2);
>> ht = matlabFunction(sin(r)/r)

ht = 

     @(x,y)sin(sqrt(x.^2+y.^2)).*1./sqrt(x.^2+y.^2)

選項#2:手動生成功能

由於您已經編寫了一組符號方程式,因此您可以簡單地將部分代碼剪切並粘貼到函數中。 以下是您的上述示例:

function output = f(beta,n1,n2,m,aa)
  u = sqrt(n2-beta.^2);
  w = sqrt(beta.^2-n1);
  a = tan(u)./w+tanh(w)./u;
  b = tanh(u)./w;
  output = (a+b).*cos(aa.*u+m.*pi)+(a-b).*sin(aa.*u+m.*pi);
end

當調用這個函數f你要輸入的值, beta和4個常數,它會返回評估你的主要表達的結果。


注意:由於您還提到要查找f零,您可以嘗試在符號方程中使用SOLVE函數:

zeroValues = solve(f,'beta');

有人用Matlab標記了這個問題,所以我假設你關心用Matlab解決方程。 如果您有Matlab Symbolic工具箱的副本,您應該能夠像之前的受訪者建議的那樣直接解決它。

如果沒有,那么我建議你寫一個Matlab m文件來評估你的函數f()。 您已編寫的偽代碼幾乎直接轉換為Matlab行。 當我讀到它時,你的函數f()只是變量beta的函數,因為你指出n1,n2,m和a都是常量。 我建議你繪制一系列值的f(beta)值。 該圖表將指示函數的0位置,您可以輕松編寫二分法或類似算法,以便為您提供所需精度的值。

如果您的廣泛意圖是擁有某些符號表達式的數值,例如,您有一個更大的程序來生成符號表達式,並且您希望將這些表達式用於數字目的,則可以使用“eval”簡單地計算它們。 如果它們的參數在工作空間中具有數值,則只需在表達式上使用eval。 例如,

syms beta
%n1,n2,m,aa= Constants
% values to exemplify
n1 = 1; n2 = 3; m = 1; aa = 5;
u = sqrt(n2-beta^2);
w = sqrt(beta^2-n1);
a = tan(u)/w+tanh(w)/u;
b = tanh(u)/w;
f = (a+b)*cos(aa*u+m*pi)+a-b*sin(aa*u+m*pi);  %# The main expression

如果beta有值

beta = 1.5;
eval(beta)

這將計算特定betaf值。 將它用作功能。 在使用自動生成的符號表達式的情況下,此解決方案將適合您,並且對於使用它們進行快速測試將非常有用。 如果您正在編寫程序來查找零,那么在必須評估函數時使用eval(f)就足夠了。 當使用Matlab函數使用匿名函數查找零會更好,但您也可以將eval(f)包裝在m文件中。

如果您對這個特定方程的答案感興趣,請嘗試Wolfram Alpha ,它將為您提供如下答案:

alt text http://www4c.wolframalpha.com/Calculate/MSP/MSP642199013hbefb463a9000051gi6f4heeebfa7f?MSPStoreType=image/gif&s=15

如果你想以編程方式解決這種類型的方程,你可能需要使用一些軟件包來進行符號代數,比如SymPy for python。

引用官方文件

>>> from sympy import I, solve
>>> from sympy.abc import x, y

求解多項式方程:

>>> solve(x**4-1, x)
[1, -1, -I, I]

求解線性系統:

>>> solve((x+5*y-2, -3*x+6*y-15), x, y)
{x: -3, y: 1}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM