【问题标题】:Calculating the numeric derivative计算数值导数
【发布时间】:2017-11-19 17:54:37
【问题描述】:

所以我对如何组织我的问题有点困惑。

所以作业状态如下:

键入执行数值推导的 m 文件 numeric_derivative.m。利用 它在 f(x) = 3x^2 /(ln(1-x))

时计算 f'(-3)

在m文件中你使用h = 10^-6 并有如下mainfunction:

function y = numericalderivative (f, x)
% Calculates the numerical value in the case of f in punk x.
% --- Input ---
% f: function handle f(x)
% x: the point where the derivative is calculated
% --- output ---
% y: the numerical derivative of f on the point x

如果我想将其保存为文件并在matlab中运行程序,那么使用句柄不是多余的吗?

【问题讨论】:

    标签: matlab derivative


    【解决方案1】:

    我不会给你作业的答案,但也许一个更简单的例子会有所帮助。

    考虑以下问题

    编写一个名为 fdiff 的函数,它接受以下两个参数:

    1. 一个函数f由一个函数句柄表示,它接受一个参数,
    2. 还有一个点x,可以假定它在f的域中。

    写入fdiff,使其返回值f(x) - f(x-1)


    解决方案(将在名为 fdiff.m 的文件中)

    function result = fdiff(f, x)
        result = f(x) - f(x-1);
    end
    

    示例用例

    >> my_function1 = @(x) 3*x^2 /(log(1-x));
    >> fdiff(my_function1, -3)
    ans =
      -10.3477
    
    >> my_function2 = @(x) x^2;
    >> fdiff(my_function2, 5)
    ans =
       9
    

    您使用fdiff 创建的是一个将另一个函数作为输入的函数。如您所见,它不仅适用于3*x^2 /(log(1-x)),还适用于您要定义的任何函数。

    你的任务的目的是创建一些非常相似的东西,除了不是计算f(x) - f(x-1),而是要求你编写一个近似于f'(x)的函数。您的用例将与第一个示例几乎相同,只是您的函数将命名为 numericalderivative,而不是 fdiff


    注意

    如果不清楚,第二个示例将my_function2 定义为x^2。因此fdiff(my_function2, 5) 返回的值是5^2 - 4^2 = 9

    【讨论】:

      【解决方案2】:

      当您将它作为函数文件并在 MATLAB 中运行它而不使用任何输入参数(即“f”和“x”)时,它会给您错误:“输入参数不足”。为了运行该文件,您必须输入类似 numericderivative (3x^2 /(ln(1-x)), 5) 的内容,它给出 x = 5 处的数值导数的值。

      【讨论】:

      • function y= numerical_derivative(f,x) h=10.^-6; func = @(x) (3*x^2)/log(1-x); x = -3; numericalderivative = @(x)((x+h)-(x))/h; dxdy = numericalderivative(func,x); end 无法格式化代码。但这似乎不起作用,但我不明白为什么?
      【解决方案3】:

      函数和,在 MATLAB 函数文件中是 DRY 编程方法的简单实现。您被要求创建一个带有句柄和 x 文件的函数,然后返回该函数句柄和该 x 值的导数。函数文件的重点是能够通过多个函数句柄或多个 x 值重用您的函数。这很有用,因为它只涉及将函数句柄和数值传递给函数。

      在您的情况下,您的脚本文件或命令窗口代码如下所示:

      func = @(x) (3*x^2)/log(1-x);
      x = -3;
      num_deriv = numericalderivative(func,x);
      

      您应该编写代码以使函数numericalderivative 工作。

      【讨论】:

      • 我认为他们希望我对 h 进行衍生。即我应该使用导数的定义。即 dxdy =@(x) f(x+h) -f(x)/h;我可以添加到函数 dxdy= (3*x^2)/log(1-x); ?
      • 我的意思是导数 = dxdy((3*x^2)/log(1-x));
      • 我现在把它写成:function y= numeric_derivative(f,x) h=10.^-6; func = @(x) (3*x^2)/log(1-x); x = -3;数值导数 = @(x,h)((x+h)-(x))/h; dxdy = 数值导数(func,x); end 但是还是不行,我是不是习惯了很少的争论?似乎我无法格式化我的代码。对不起
      • 看来您需要向函数传递另一个参数。其余部分不是基于 matlab 的,只是您对数值方法的理解。特别是 x(分析点)与 h(步长)。
      猜你喜欢
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多