0

我正在尝试使用 MATLAB 编写一个小程序,在该程序中我尝试区分我在不同函数中创建的函数,但我不断收到错误。

我的文件是:

牛顿米:

function [ y, iter ] = newton( f, fp, x0 )

    iter = 0;
    xprev = x0;
    x = xprev - f(xprev)/fp(xprev);

    iter = iter + 1;

    while abs(x-xprev) > eps*abs(x)
        xprev = x;
        x = x - f(x)/fp(x);
        iter = iter + 1;
        y = x;
    end
end  

调频:

function y = f(x)
    y = tan(x) - 2*x;
end  

fp.m:

function y = fp(f)
    y = diff(f);
end

我正在运行以下内容:

[y, iter] = newton(@f, @fp, 1.4)  

并得到:

错误使用/
矩阵尺寸必须一致。

牛顿错误(第 6 行)x = xprev - f(xprev)/fp(xprev);

当我检查yfp.m 的值时,我不断得到[].

4

1 回答 1

1

您正在尝试使用diff来区分功能。开箱即用在diff元素对之间执行差异操作。你不想要这个。相反,将您的fandfp作为实际的函数句柄。首先创建你的函数的符号定义,然后使用的符号版本(你可以自己调用它)f来区分这个符号表示,然后用这个创建一个 MATLAB 函数:diffdiffmatlabFunction

%// Define symbolic variable
syms x;

%// Define function symbolically
y = tan(x) - 2*x;

%// Define function handles (numerical) to the original and derivative
f = matlabFunction(y); 
fp = matlabFunction(diff(y));

%// Now call Newton's Method
[y, iter] = newton(f, fp, 1.4);  

请注意,f并且fp已经是函数句柄。这就是matlabFunction返回的结果,因此不再需要创建句柄@作为 Newton 方法函数的输入。

对你的代码运行这个修改,我得到这个根,初始猜测x = 1.4和它所花费的迭代量:

>> format long g
>> y

y =

          1.16556118520721

>> iter

iter =

     8

如果符号数学工具箱丢失...

如果由于某种原因您没有符号数学工具箱,那么我的建议将不起作用。因此,您别无选择,只能使用导数的离散近似来使其工作。但是,我们仍然可以使用我上面编写的代码,但fp必须以不同的方式定义。

如果您还记得,导数的定义是这样的:

为了让它在离散情况下工作,你做的Δx非常小......1e-10例如。

因此,您可以使用匿名函数来代替:

%// Define function
f = @(x) tan(x) - 2*x;

%// Define derivative
h = 1e-10;
fp = @(x) (f(x + h) - f(x)) / h;

%// Now call Newton's Method
[y, iter] = newton(f, fp, 1.4); 

有了这个,我得到:

>> format long g;
>> y

y =

          1.16556118520721

>> iter

iter =

     8

我会说这非常接近!

于 2015-11-20T17:39:04.777 回答