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* f素数(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));

我没有将函数作为参数传递的原因是因为我想对不同的订单使用相同的代码......并且不同的订单不需要相同数量的函数。

有没有一种方法可以提示用户一次使用这些功能,并在整个过程中使用这些功能而无需再次提示?

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 回答