0

関数を作成して、シンプソンの法則を再現しようとしています。ただし、 eval を使用して文字列を MatLab の実際の関数に変換する方法はまだ明確ではありません。

機能は次のとおりです。

function result = simpson(fun, x0, xn, n)
    f = eval(fun);
    h = (xn-x0)/2;
    xstart = f(x0) + f(xn);
    x1 = 0;
    x2 = 0;

    for i = 1:n-1
        x = x0 + h*i;
        if (mod(i,2) == 0)
            x2 = x2 + f(x);
        else
            x1 = x1 + f(x);
        end
    end

    result = h*(xstart + 2*x2 + 4*x1)/3;

報告されたエラーは

Error using eval
Undefined function or variable 'x'

関数の文字列形式に x を渡すにはどうすればよいですか?

4

2 に答える 2

1

それを行うためのクリーンな方法: 関数ハンドルを使用し、eval を回避します。

関数ハンドルはここに文書化されています: http://www.mathworks.de/de/help/matlab/ref/function_handle.html

次のように定義します。

sqr = @(x) x.^2;

次に、関数を呼び出します。

simpson(sqr, 1, 2, 3);

関数内で fun(3) を呼び出し、結果として 9 を取得できるはずです。


eval を使用する必要がある場合は、次の 2 つの解決策が考えられます。

  1. 卑劣な方法: simpson('@(x) x.^2')(eval は適切な関数ハンドルを作成します)

  2. 汚い方法:

    function result = simpson(fun)
        x = 4;
        f = eval(fun);
        result = f;
        return;
    end
    

次のように呼び出します。simpson('x.^2')

于 2013-10-26T09:04:12.427 に答える
1

ここで問題になるのは、eval使用方法です。ドキュメントは、あなたの例では、出力がf関数ハンドルではなく(コードがそれを使用する方法で期待される)、fun関数の出力であることを示しています。

したがって、関数を機能させるには、eval関数に入力を提供する必要があります。

例えば:

fun = 'x.^2';    
x = 4;    
f = eval(fun);

結果はf == 16

つまり、呼び出したいときはいつでも、適切な値funに設定xし、eval を呼び出して結果を保存する必要があります。

たとえば、コードでは次のようになります。

f = eval(fun);
h = (xn-x0)/2;
xstart = f(x0) + f(xn);

次のようになります。

h = (xn-x0)/2;
x = x0;
fx0 = eval(fun);
x = xn; 
fxn = eval(fun);
xstart = fx0 + fxn;

これを実装するためのより安全で簡単な方法として関数ハンドルをお勧めしますが、コメントで述べたように、これはあなたのケースでは許可されていません。

于 2013-10-26T09:56:21.473 に答える