【问题标题】:MATLAB get input for functions only onceMATLAB 只获取一次函数的输入
【发布时间】:2013-02-17 14:32:16
【问题描述】:

我希望我的 Taylor 方法能够在执行时提示函数。我尝试使用input(prompt),如 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);

但我得到了一个错误:

错误使用 + 矩阵维度必须一致。

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

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

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

【问题讨论】:

    标签: matlab input


    【解决方案1】:

    如果要将表达式存储为字符串,可以使用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);
    

    【讨论】:

      【解决方案2】:

      不是要求用户输入,你不能只使用一个单元格数组吗?这解决了函数数量不同的问题,并使您的代码具有更灵活的用途。

      您的代码可能类似于:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-19
        • 2021-12-22
        • 2022-01-23
        • 1970-01-01
        • 2013-08-05
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多