MATLAB只能输入一次函数

时间:2013-02-17 06:05:18

标签: matlab input

我希望我的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);

但我收到了一个错误:

  

使用+ Matrix维度时出错必须同意。

     

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),           瓦特(IDX));

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

有没有办法可以提示用户一次使用这些功能,并在不提示再次使用的情况下使用这些功能?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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})

根据需要提供尽可能多的衍生物(或更多;它不关心)。