【问题标题】:Differentiation using MATLAB使用 MATLAB 进行微分
【发布时间】:2015-11-20 12:12:08
【问题描述】:

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

我的文件是:

牛顿.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  

f.m:

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

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

【问题讨论】:

标签: matlab function differentiation


【解决方案1】:

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

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

我会说这非常接近!

【讨论】:

  • 感谢您的回答!我想我错过了一些东西。我需要在命令窗口中创建函数 f 的符号定义还是作为新的“m”文件?
  • @Buzi 不,您不需要为原始函数及其衍生函数制作新的 M 文件。您直接在代码中创建函数句柄。只需将我上面写的代码,放入一个新的 M 文件并运行它。我让它运行,这就是我得到答案的方式。顺便说一句,当您开始使用此功能时,如果您不再需要任何帮助,请考虑接受我的回答以向 SO 社区表明您不需要更多帮助。祝你好运!
  • 我应该用特定的名称调用新的 M 文件吗?当然,我会将您的回答标记为有帮助:)
  • 是的,可以称之为newtontest.m,将上面的代码放在这个文件中,然后运行它。完成后,您将获得根目录和迭代......谢谢!
  • 我不断收到错误消息:newtontest (line 2) syms x 中的错误;
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多