7

シンボリック式から関数を作成するにはどうすればよいですか?たとえば、私は次のようにしています。

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または、そのようなネストされた式のゼロを見つけるにはどうすればよいですか?

4

4 に答える 4

11

いくつかのオプションがあります...

オプション#1:関数を自動的に生成する

Symbolic Toolboxのバージョン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

この関数を呼び出すときは、と4つの定数fの値を入力する必要がbetaあり、主な式を評価した結果が返されます。


注:のゼロを見つけたいとも述べたので、シンボリック方程式でSOLVEf関数を使用してみることができます。

zeroValues = solve(f,'beta');
于 2010-01-03T17:06:21.817 に答える
1

誰かがこの質問にMatlabのタグを付けたので、Matlabで方程式を解くことに関心があると思います。Matlab Symbolicツールボックスのコピーがある場合は、前の回答者が示唆したように、それを直接解決できるはずです。

そうでない場合は、関数f()を評価するためにMatlabmファイルを作成することをお勧めします。すでに作成した擬似コードは、ほぼ直接Matlabの行に変換されます。私が読んだように、あなたの関数f()は、n1、n2、mとaがすべて定数であることを示しているので、変数betaのみの関数です。ある範囲の値に対してf(beta)の値をプロットすることをお勧めします。グラフは関数の0がどこにあるかを示し、二分法または同様のアルゴリズムを簡単にコード化して、希望する精度で値を与えることができます。

于 2010-01-03T17:19:19.687 に答える
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)

fこれにより、特定のの値が計算されますbeta。関数として使用します。このソリューションは、自動生成されたS式を使用するシナリオに適しており、それらを使用した高速テストに役立ちます。ゼロを見つけるプログラムを作成している場合はeval(f)、関数を評価する必要があるときに使用すれば十分です。Matlab関数を使用して無名関数を使用してゼロを見つける場合は優れていますがeval(f)、mファイル内をラップすることもできます。

于 2016-10-24T02:58:25.237 に答える
-1

この特定の方程式の答えだけに興味がある場合は、WolframAlphaを試してください。次のような答えが得られます。

代替テキストhttp://www4c.wolframalpha.com/Calculate/MSP/MSP642199013hbefb463a9000051gi6f4heeebfa7f?MSPStoreType=image/gif&s=15

このタイプの方程式をプログラムで解きたい場合は、Python用のSymPyなど、記号代数用のソフトウェアパッケージを使用する必要があります。

公式ドキュメントの引用:

>>> 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}
于 2010-01-03T16:45:27.263 に答える