2013-02-17 75 views
0

我希望我的泰勒方法能够在执行时的功能提示。我试着用input(prompt)作为MATLAB文档中的说明。问题是,它会提示我每次遇到代码时都要输入函数。MATLAB获取函数的输入只有一次

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); 

但我得到了一个错误:

Error using + Matrix dimensions must agree.

Error in taylorMethod>@(t,w)f(t,w)+h/2*fPrime(t,w) (line 13) taylor2 = @(t, w) f(t, w) + h/2*fPrime(t, w);

Error in taylorMethod/w (line 47) res = w(j) + h*taylor2(t(j), w(j));

Error in taylorMethod (line 35) fprintf('i = %d; t_i = %.2f; w(i) = %.10f\n', idx, t(idx), w(idx));

的原因,我没有通过功能作为参数,是因为我要使用不同的顺序相同的代码...和不同的订单不会有相同数量的所需要的功能。

有没有办法,我可以提示用户一次的功能,并使用功能,可不必再提示的方法吗?

回答

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}) 

在必要时提供尽可能多的衍生工具(或更多;它不关心)。

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);