1

シンボリック計算にはmatlabを使用します。長い計算の結果、ベッセル関数の組み合わせであるxの関数が得られ、それがゼロであることを確認したいと思います。

そのためにfzero、Matlabの関数を使用します。ただし、単一ベッセル関数では完全に機能しますが、鉱山関数では機能しません。

>> fzero(@(x)besselj(0,x), 3.5)
ans =
    2.4048

>> fzero(@(x)DELTA_xi, 3.5) ??? Undefined function or method 'isfinite' for input arguments of type 'sym'.

Error in ==> fzero at 333 elseif ~isfinite(fx) || ~isreal(fx)

>> DELTA_xi besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(1, x)*bessely(0, x) - besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(0, x)*bessely(1, x) - besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(0, x)*besselk(1, x) + besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(1, x)*besselk(0, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(0, x)*bessely(1, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(1, x)*bessely(0, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(0, x)*besselj(1, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(1, x)*besselj(0, x)

なぜこれが起こるのですか?問題を解決する方法は?

前もって感謝します

4

2 に答える 2

2

関数ハンドルを記号表現と間違えたと思います。

fzeroには関数ハンドルが必要です。

だからあなたがそうするなら:

DELTA_xi = @(x) besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(1, x)*bessely(0, x) - besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(0, x)*bessely(1, x) - besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(0, x)*besselk(1, x) + besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(1, x)*besselk(0, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(0, x)*bessely(1, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(1, x)*bessely(0, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(0, x)*besselj(1, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(1, x)*besselj(0, x)
fzero(DELTA_xi, 3.5)

あなたが得る

3.8173

シンボリック関数を呼び出したい場合は、間接的に行う必要があることに注意してください。

fzero(@(x)eval(DELTA_xi), 3.5)
于 2011-05-20T17:39:34.193 に答える
2

ラスマンはすでにあなたの問題に対する1つの解決策を提供しましたが、私はあなたがエラーを受け取った理由をより詳細に説明し、別の可能な解決策を提供すると思いました。

まず、コードからこの無名関数を検討します。

fcn1 = @(x) besselj(0,x);

この関数は1つの入力引数xを取り、それを関数BESSELJに渡して評価され、出力として返されます。FZEROはこの機能を使用しても問題ありません。

DELTA_xiここで、コードからのこの他の無名関数について考えてみましょう。この関数は、シンボリック変数を使用して作成されたシンボリック方程式を式として持ってい'x'ます。

fcn2 = @(x) DELTA_xi;

この関数は入力引数を取りますが、xこの入力引数で何をすべきでしょうか?xMATLABは、入力変数をのシンボリック変数'x'に接続することを自動的に認識しないDELTA_xiため、この関数がFZEROによって評価されると、シンボリック方程式が返されますDELTA_xi(FZEROは、表示されるエラーで示されているように、使用できません)。

Rasmanのソリューションのように関数EVALを使用すると、FZEROから無名関数に渡される利用可能な値を使用して評価され、問題が解決されます。ただし、別の解決策は、次のようにSUBS関数を使用することです。DELTA_xix

fzero(@(x) subs(DELTA_xi,'x',x), 3.5)

これは、のシンボリック変数のx出現ごとに入力値を置き換えます。基本的にEVALと同じことを行いますが、入力引数がどのシンボリック変数を置き換えるかを明示的に示します。違い?これが機能することに注意してください。'x'DELTA_xi

fzero(@(y) subs(DELTA_xi,'x',y), 3.5)

しかし、これはしません:

fzero(@(y) eval(DELTA_xi), 3.5)

入力変数とシンボリック変数の名前が一致しないためです。

于 2011-05-20T19:06:14.330 に答える