【问题标题】:How do I find the derivative of a function in Octave?如何在 Octave 中找到函数的导数?
【发布时间】:2016-07-14 14:31:57
【问题描述】:

输入:

Xf = 和保存点 x 值的数组

Yf = 保存点方法的 y 值的数组 = 2 点前向差、2 点后向差、3 点中心差、5 点中心差

输出:

X = 包含可以实际使用所选方法的有效 x 值的数组(例如,您不能在 Xf 数组的上限使用前向差分方法,因为没有值之后)

DF = 这些点的导数

我需要给一个脚本一组点,然后使用 4 种不同的方法计算这些点的导数不使用像 diff 这样的内置导数函数。我需要一些帮助来编写其中一个代码,然后我想我应该能够弄清楚如何完成其​​余的工作。

2-point forward difference

我的尝试:

[a, minidx] = min(Xf);
[b, maxidx] = max(Xf);
n = 10;
h = (b-a)/n;
f = (x .^3) .* e.^(-x) .* cos(x);

If method = "forward" #Input by user

    X = [min(Xf), Xf(maxidx-1)];
    for k = min(Xf):n # not sure if this is the right iteration range...

        f(1) = f(x-2*h) + 8*f(x +h);
        f(2) = 8*f(x-h) + f(x+2*h);
        DF = (f1-f2)/(12*h);

    endfor
endif

【问题讨论】:

    标签: matlab for-loop octave derivative


    【解决方案1】:

    Demo octave 函数计算导数:

    #This octave column vector is the result y axis/results of your given function  
    #to which you want a derivative of.  Replace this vector with the results of  
    #your function. 
    observations = [2;8;3;4;5;9;10;5] 
     
    #dy (aka the change in y) is the vertical distance (amount of change) between  
    #each point and its prior.  The minus sign serves our purposes to "show me the  
    #vertical different per unit x."  The NaN in square brackets does a 1 position 
    #shift, since I want my tangent lines to be delimited by 1 step each. 
    dy = observations - [NaN; observations(1:end-1,:)] 
     
    #dx (aka the change in x) is the amount of horizontal distance (amount of  
    #change) between each point and its prior.  for simplicity we make these all 1,  
    #however your data points might not be constant width apart, that's okay  
    #to populate the x vector here manually using the parameter-inputs to the  
    #function that you want the derivative of. 
    dx = ones(length(observations), 1) 
     
    # -- alternative: if your x vector is subjective, then do something like: -- 
    #function_parameters = [1;3;5;9;13;90;100;505] 
    #dx = function_parameters 
     
    #The derivative of your original function up top is "the slope of the  
    #tangent line to the point on your curve.  The slope is calculated with the  
    #equation: (rise / run) such that 'Rise' is y, and 'run' is x.  The tangent  
    #line is calculated above with the dy variable.  'The point' is each point  
    #in the observations, and 'the curve' is simply your function up top that  
    #yielded those y results and x input parameters. 
    dy_dx_dv1_macd = dy ./ dx 
    

    如果这段代码让您感到害怕,那么这段视频将详细介绍 eli5 发生的事情以及为什么每个部分都起作用: https://youtu.be/gtejJ3RCddE?t=5393

    曲线上一点的切线斜率是导数的定义。您可以使用八度(或任何计算机语言)为您的给定函数计算它。作为练习,绘制这些图,您应该会看到 x 平方的导数是 x,而 sin(x) 的导数是 cos(x)。当你看到它时它很漂亮,因为这是大多数机器学习算法的核心。衍生品会根据您所在的位置告诉您在哪里可以找到奖励。

    【讨论】:

      【解决方案2】:

      这里有一些关于 Matlab 如何计算导数的文档:

      diff Difference and approximate derivative.
           diff(X), for a vector X, is [X(2)-X(1)  X(3)-X(2) ... X(n)-X(n-1)].
           diff(X), for a matrix X, is the matrix of row differences,
                 [X(2:n,:) - X(1:n-1,:)].
           diff(X), for an N-D array X, is the difference along the first
                non-singleton dimension of X.
           diff(X,N) is the N-th order difference along the first non-singleton 
                dimension (denote it by DIM). If N >= size(X,DIM), diff takes 
                successive differences along the next non-singleton dimension.
           diff(X,N,DIM) is the Nth difference function along dimension DIM. 
               If N >= size(X,DIM), diff returns an empty array.
      
      Examples:
         h = .001; x = 0:h:pi;
         diff(sin(x.^2))/h is an approximation to 2*cos(x.^2).*x
         diff((1:10).^2) is 3:2:19
      
         If X = [3 7 5
                 0 9 2]
         then diff(X,1,1) is [-3 2 -3], diff(X,1,2) is [4 -2
                                                        9 -7],
         diff(X,2,2) is the 2nd order difference along the dimension 2, and
         diff(X,3,2) is the empty matrix.
      

      这是另一个例子:

      xp= diff(xf);
      yp= diff(yf);
      
      % derivative:
      dydx=yp./xp;
      % also try:
      dydx1=gradient(yf)./gradient(xf)
      

      【讨论】:

        【解决方案3】:

        https://wiki.octave.org/Symbolic_package

        % this is just a formula to start with,  
        % have fun and change it if you want to.  
        f = @(x) x.^2 + 3*x - 1 + 5*x.*sin(x);  
        % these next lines take the Anonymous function into a symbolic formula  
        pkg load symbolic  
        syms x;  
        ff = f(x);  
        % now calculate the derivative of the function  
        ffd = diff(ff, x)  
        % answer is ffd = (sym) 5*x*cos(x) + 2*x + 5*sin(x) + 3  
        ...  
        

        【讨论】:

        • 找到导数后如何评估特定值?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多