2015-11-20 43 views
0

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

我的文件有:

newton.m:

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 

FM:

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) 

并获得:

Error using /
Matrix dimensions must agree.

Error in newton (line 6) x = xprev - f(xprev)/fp(xprev);

当我检查的y在fp.m我不断收到[]值。

+0

函数'diff'返回向量中元素之间的差异。见diff>。你需要在调用'fp' –

回答

1

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

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

请注意,ffp已经是功能句柄。这就是matlabFunction返回的结果,因此不再需要通过@创建一个句柄作为牛顿方法函数的输入了。

运行这个修改你的代码,我得到这个在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 

我会说那是相当的接近!

+0

时至少得到两个值谢谢你的答案!我想我错过了一些东西。我是否需要在命令窗口中创建函数f的符号定义或作为新的'm'文件? – Buzi

+0

@Buzi不,您不需要为原始函数及其派生文件创建一个新的M文件。你直接在代码中创建你的函数句柄。只需将我上面写的代码放入一个新的M文件并运行即可。我得到它运行,这就是我得到我的答案。顺便说一句,当你得到这个工作,如果你不需要任何帮助,考虑接受我的答案,向SO社区表明你不需要更多的帮助。祝你好运! – rayryeng

+0

我应该使用特定名称来调用新的M文件吗?当然,我会将你的答案标记为有用:) – Buzi