0

Taylorメソッドが実行時に関数のプロンプトを表示できるようにしたいと思います。MATLABのドキュメントで説明されているようにinput(prompt)を使用してみました。問題は、コードで関数が検出されるたびに関数を入力するように求められることです。

function taylorMethod(a, b, h, alpha, order)

    f = @(t, y) input('Enter f(t, y): ');
    fPrime = @(t, y) input('Enter f''(t, y): ');
    taylor2 = @(t, w) f(t, w) + h/2*fPrime(t, w);

    if order > 2
        f2Prime = @(t, y) input('Enter f''''(t, y): ');
        taylor3 = @(t, w) taylor2(t, w) + h^2/factorial(3)*f2Prime(t, w);
        if order == 4
            f3Prime = @(t, y) input('Enter f''''''(t, y): ');
            taylor4 = @(t, w) taylor3(t, w) + h^3/factorial(4)*f3Prime(t, w);
        end
    end

    function res = t(i)
        if i == a
            res = a;
            return;
        end
        res = h + t(i - 1);
    end

    idx = a;
    for i = a:h:b
        fprintf('i = %d; t_i = %.2f; w(i) = %.10f\n', idx, t(idx), w(idx));
        idx = idx + 1;
    end


    function res = w(i)
        j = i - 1;
        if i == a
            res = alpha;
            return;
        end
        if order == 2
            res = w(j) + h*taylor2(t(j), w(j));
        elseif order == 3
            res = w(j) + h*taylor3(t(j), w(j));
        elseif order == 4
            res = w(j) + h*taylor4(t(j), w(j));
        end
        return;
    end

end

また、ユーザー入力を次のような文字列に保存しようとしました。

fString = input('Enter f(t, y): ', 's');
fPrimeString = input('Enter f''(t, y): ', 's');
f = @(t, y) fString;
fPrime = @(t, y) fPrimeString;
taylor2 = @(t, w) f(t, w) + h/2*fPrime(t, w);

しかし、エラーが発生しました:

+行列の次元の使用エラーは一致する必要があります。

taylorMethod> @(t、w)f(t、w)+ h / 2 * fPrime(t、w)のエラー(13行目)taylor2 = @(t、w)f(t、w)+ h / 2 * fPrime(t、w);

taylorMethod / wのエラー(47行目)res = w(j)+ h * taylor2(t(j)、w(j));

taylorMethodのエラー(35行目)fprintf('i =%d; t_i =%.2f; w(i)=%.10f \ n'、idx、t(idx)、w(idx));

関数を引数として渡さない理由は、異なる順序に同じコードを使用したいためです...そして異なる順序では必要な関数の数が同じではありません。

ユーザーに関数の入力を1回プロンプトし、再度プロンプトを表示せずに関数全体を使用する方法はありますか?

4

2 に答える 2

2

式を文字列として保存する場合は、を使用できますeval。しかし、それは非常に強力なソリューションです。入力を完全に信頼して悪意のあることを行わない場合にのみ使用してください。

fString = input('Enter f(t, y): ', 's');
fPrimeString = input('Enter f''(t, y): ', 's');
f = @(t, y) eval(fString);
fPrime = @(t, y) eval(fPrimeString);
taylor2 = @(t, w) f(t, w) + h/2*fPrime(t, w);

よりクリーンな方法は、ユーザー入力を関数に変換することです。

f = str2func(['@(t, y)' input('Enter f(t, y): ', 's')]);
fPrime = str2func(['@(t, y)' input('Enter f''(t, y): ', 's')]);
taylor2 = @(t, w) f(t, w) + h/2*fPrime(t, w);
于 2013-02-17T06:31:11.023 に答える
1

ユーザー入力を求めるのではなく、関数のセル配列を取得するだけではいけませんか?これにより、さまざまな数の関数の問題が解決され、コードがより柔軟な種類の用途に開かれます。

コードは次のようになります。

function taylorMethod(a, b, h, alpha, order, funcs)

    f = funcs{1}; % first element is f(t, y)
    fPrime = funcs{2}; % f'(t, y)
    taylor2 = @(t, w) f(t, w) + h/2*fPrime(t, w);

    if order > 2
        f2Prime = funcs{3}; % f''(t, y)
        taylor3 = @(t, w) taylor2(t, w) + h^2/factorial(3)*f2Prime(t, w);
        if order == 4
            f3Prime = funcs{4}; % f'''(t, y)
            taylor4 = @(t, w) taylor3(t, w) + h^3/factorial(4)*f3Prime(t, w);
        end
    end

   % the rest is the same

あなたが好きかもしれない

taylorMethod(a, b, h, alpha, 3, {@(t, y) y^3, @(t, y) 3*y^2, @(t, y) 6*y})

必要な数の派生物を提供します(またはそれ以上。それは気にしません)。

于 2013-02-17T06:09:14.693 に答える