【问题标题】:Unexpected "function handle with value" returned from secant method function从割线方法函数返回意外的“带值的函数句柄”
【发布时间】:2018-02-25 16:37:59
【问题描述】:

我正在尝试通过使用 MATLAB 中的割线方法找到函数 y = exp(2x) + 3x -4 的根。

我得到了初始值 x1=0.5x2=0.4,但是,如果我运行我的代码,我会从 MATLAB 得到一个“带值的函数句柄”输出。

这是我的代码:

function [f] = fopg1(x)
    f = @(x) exp(2*x)+3*x-4;
    x(1) = 0.5;
    x(2) = 0.4;
    for i=3:5
        x(i) = x(i-1) - (f(x(i-1)))*((x(i-1) - x(i-2))/(f(x(i-1)) - f(x(i-2))));
    end

谁能解释为什么我的函数不能正常运行?

【问题讨论】:

  • “无法正常运行”是什么意思?请学习正确格式化您的问题。
  • @beaker 如前所述,我得到了“带值的函数句柄”输出。我不知道它是什么,但幸运的是,我已经得到了一个有用的答案。

标签: matlab function output


【解决方案1】:

当您期望返回 x 时,您输出了错误的变量,即 f。将第一行改为

function [x] = fopg1(x)

如果你只是想输出最终的值,那就是x(5),所以

function result = fopg1(x)
    % your function 
    % ... 
    result = x(end);

目前这也可能是一个脚本,因为您已经硬编码了初始猜测、函数和最大迭代次数 (3)。如果你想利用 this 作为一个函数,你不妨输入一个函数句柄和初始条件。最大迭代次数通常与容差配对,这样如果两个连续的x 值足够接近,您就会停止。

function x = mySecant( f, x0, n, tol )
%% Find root using secant method
% Inputs: f   - a function handle
%         x0  - 1x2 array of initial guesses
%         n   - maximum number of iterations        
%         tol - tolerance of convergence
    x = x0;
    for i = 3:n+2
        % Stop iterating if converged
        if abs(x(i-2) - x(i-1)) < tol
            break
        end
        % iterate
        x(i) = x(i-1) - (f(x(i-1)))*((x(i-1) - x(i-2))/(f(x(i-1)) - f(x(i-2))));
    end

同样,如果您只想输出收敛值,请使用上面的x(end) 方法。

使用

调用
x = mySecant( @(x) exp(2*x)+3*x-4, [0.5,0.4], 3, 1e-3 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多