1

Matlab で複雑な非線形関数を宣言したかったので、次のように書きました。

>> syms x

>> f=inline((3/2)*(7.02^2))-(2*18*x*((1-(x/18))*(1-(exp(-18/x)))))

しかし、それは機能せず、次のエラーを返します:

??? Error using ==> inline.inline at 47
Input must be a string.

ループ内で関数として使用できるように宣言するにはどうすればよいですか?

この関数のルートを数値的に見つけたいので、ループで使用できるように最初に宣言する必要があります。

4

2 に答える 2

1

括弧に問題があり、一重引用符を追加する必要がありました。

>>f=inline('((3/2)*(7.02^2))-(2*18*x*((1-(x/18))))*(1-(exp(-18/x)))')
于 2012-08-15T14:44:36.630 に答える
0

まず、演算子の優先順位について学習する必要があります。そうすれば、混乱を招く括弧の多くを避けることができます。

第二に、他のほとんどの人がここで述べているように、inline速度が遅く、この目的には適していません。関数ハンドルとも呼ばれる無名関数を使用する (そして適切に使用する方法を学習する) ほうがよいでしょう。

第三に、この関数のルートを見つけたい場合は、独自のバージョンを設計して実装するのではなく、その目的専用の広範囲にテストされた Matlab 関数を使用することをお勧めします。

>> f = @(x) 3/2*7.02^2 - 2*18*x.*(1-x/18).*(1-exp(-18./x));    
>> root1 = fzero(f, 14)
root1 = 
    1.440303362822718e+01

>> root2 = fzero(f, 2.5)
root2 = 
     2.365138420421266e+00

>> root3 = fzero(f, 0)    %# (if you're into that kind of perversion)
root3 = 
    0

からの値をランダムにテストし、結果-100:100unique-ing して初期値を見つけました。これは決してすべてのルートを見つけるための堅牢な方法ではありませんが、もっと良い方法を思い付くことができると信じています (いずれにせよ、問題は分析的に解決するのがかなり簡単です)。

于 2012-08-16T12:15:59.000 に答える