MATLAB 微分

  • 微分

    MATLAB提供了diff命令来计算符号导数。以最简单的形式,将要区分的函数作为参数传递给diff命令。
    例如,让我们计算函数f(t)= 3t 2 + 2t -2的导数
    - 创建一个脚本文件并在其中键入以下代码-
    
    syms t
    f = 3*t^2 + 2*t^(-2);
    diff(f)
    
    编译并执行上述代码后,将产生以下结果-
    
    ans =
    6*t - 4/t^3
    
    以下是上述计算的Octave等效-
    
    pkg load symbolic
    symbols
    
    t = sym("t");
    f = 3*t^2 + 2*t^(-2);
    differentiate(f,t)
    
    执行代码并返回以下结果-
    
    ans =
       -(4.0)*t^(-3.0)+(6.0)*t
    
  • 微分基本规则验证

    让我们简要说明各种用于函数微分的方程或规则,并验证这些规则。为此,我们将为一阶导数写f'(x),为二阶导数写f''(x)。
    以下是区分规则-
    规则1
    对于任何函数f和g以及任何实数a和b是该函数的导数-
    相对于x的 h(x)= af(x)+ bg(x)由-
    h'(x)= af'(x)+ bg'(x)
    规则二
    的总和和减法规则状态,如果f和g是两个函数,F“和G”是它们的衍生物分别接,
    (f + g)'= f'+ g'
    (f-g)'= f'-g'
    规则三
    该产品规则指出,如果f和g是两个函数,F''和G''分别是它们的衍生物,然后,
    (fg)'= f'.g + g'.f
    规则四
    的商数规则指出,如果f和g是两个函数,F“和G”分别是它们的衍生物,然后,
    (f / g)'=(f'.g-g'.f)/ g 2
    规则五
    的多项式如果是,或基本功率规则状态Y = F(X)= X n,则F” = N.x (n-1)
    该规则的直接结果是任何常数的导数为零,即,如果y = k,则任何常数,则
    f'= 0
    规则六
    所述链规则指出,衍生物的函数的函数的H(X)= F(G(X))相对于x是,
    h'(x)= f'(g(x)).g'(x)
    - 创建一个脚本文件并在其中键入以下代码-
    
    syms x
    syms t
    
    f = (x + 2)*(x^2 + 3)
    der1 = diff(f)
    
    f = (t^2 + 3)*(sqrt(t) + t^3)
    der2 = diff(f)
    
    f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2)
    der3 = diff(f)
    
    f = (2*x^2 + 3*x)/(x^3 + 1)
    der4 = diff(f)
    
    f = (x^2 + 1)^17
    der5 = diff(f)
    
    f = (t^3 + 3* t^2 + 5*t -9)^(-6)
    der6 = diff(f)
    
    运行文件时,MATLAB显示以下结果-
    
    f =
       (x^2 + 3)*(x + 2)
     
       der1 =
       2*x*(x + 2) + x^2 + 3
      
    f =
       (t^(1/2) + t^3)*(t^2 + 3)
     
       der2 =
       (t^2 + 3)*(3*t^2 + 1/(2*t^(1/2))) + 2*t*(t^(1/2) + t^3)
      
    f =
       (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2)
      
    der3 =
       (2*x - 2)*(3*x^3 - 5*x^2 + 2) - (- 9*x^2 + 10*x)*(x^2 - 2*x + 1)
     
    f =
       (2*x^2 + 3*x)/(x^3 + 1)
      
    der4 =
       (4*x + 3)/(x^3 + 1) - (3*x^2*(2*x^2 + 3*x))/(x^3 + 1)^2
      
    f =
       (x^2 + 1)^17
      
    der5 =
       34*x*(x^2 + 1)^16
      
    f =
       1/(t^3 + 3*t^2 + 5*t - 9)^6
      
    der6 =
       -(6*(3*t^2 + 6*t + 5))/(t^3 + 3*t^2 + 5*t - 9)^7
    
    以下是Octave计算的等效-
    
    pkg load symbolic
    symbols
    
    x = sym("x");
    t = sym("t");
    
    f = (x + 2)*(x^2 + 3) 
    der1 = differentiate(f,x) 
    
    f = (t^2 + 3)*(t^(1/2) + t^3) 
    der2 = differentiate(f,t) 
    
    f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2) 
    der3 = differentiate(f,x) 
    
    f = (2*x^2 + 3*x)/(x^3 + 1) 
    der4 = differentiate(f,x) 
    
    f = (x^2 + 1)^17 
    der5 = differentiate(f,x) 
    
    f = (t^3 + 3* t^2 + 5*t -9)^(-6) 
    der6 = differentiate(f,t)
    
    执行代码并返回以下结果-
    
    f =
    
    (2.0+x)*(3.0+x^(2.0))
    der1 =
    
    3.0+x^(2.0)+(2.0)*(2.0+x)*x
    f =
    
    (t^(3.0)+sqrt(t))*(3.0+t^(2.0))
    der2 =
    
    (2.0)*(t^(3.0)+sqrt(t))*t+((3.0)*t^(2.0)+(0.5)*t^(-0.5))*(3.0+t^(2.0))
    f =
    
    (1.0+x^(2.0)-(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0))
    der3 =
    
    (-2.0+(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0))+((9.0)*x^(2.0)-(10.0)*x)*(1.0+x^(2.0)-(2.0)*x)
    f =
    
    (1.0+x^(3.0))^(-1)*((2.0)*x^(2.0)+(3.0)*x)
    der4 =
    
    (1.0+x^(3.0))^(-1)*(3.0+(4.0)*x)-(3.0)*(1.0+x^(3.0))^(-2)*x^(2.0)*((2.0)*x^(2.0)+(3.0)*x)
    f =
    
    (1.0+x^(2.0))^(17.0)
    der5 =
    
    (34.0)*(1.0+x^(2.0))^(16.0)*x
    f =
    
    (-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-6.0)
    der6 =
    
    -(6.0)*(-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-7.0)*(5.0+(3.0)*t^(2.0)+(6.0)*t)
    
  • 指数,对数和三角函数的导数

    下表提供了常用的指数,对数和三角函数的导数-
    函数 导数
    ca.x ca.x.ln c.a (ln is natural logarithm)
    ex ex
    ln x 1/x
    lncx 1/x.ln c
    xx xx.(1 + ln x)
    sin(x) cos(x)
    cos(x) -sin(x)
    tan(x) sec2(x), or 1/cos2(x), or 1 + tan2(x)
    cot(x) -csc2(x), or -1/sin2(x), or -(1 + cot2(x))
    sec(x) sec(x).tan(x)
    csc(x) -csc(x).cot(x)
    - 创建一个脚本文件并在其中键入以下代码-
    
    syms x
    y = exp(x)
    diff(y)
    
    y = x^9
    diff(y)
    
    y = sin(x)
    diff(y)
    
    y = tan(x)
    diff(y)
    
    y = cos(x)
    diff(y)
    
    y = log(x)
    diff(y)
    
    y = log10(x)
    diff(y)
    
    y = sin(x)^2
    diff(y)
    
    y = cos(3*x^2 + 2*x + 1)
    diff(y)
    
    y = exp(x)/sin(x)
    diff(y)
    
    运行文件时,MATLAB显示以下结果-
    
    y =
       exp(x)
       ans =
       exp(x)
    
    y =
       x^9
       ans =
       9*x^8
      
    y =
       sin(x)
       ans =
       cos(x)
      
    y =
       tan(x)
       ans =
       tan(x)^2 + 1
     
    y =
       cos(x)
       ans =
       -sin(x)
      
    y =
       log(x)
       ans =
       1/x
      
    y =
       log(x)/log(10)
       ans =
       1/(x*log(10))
     
    y =
       sin(x)^2
       ans =
       2*cos(x)*sin(x)
     
    y =
       cos(3*x^2 + 2*x + 1)
       ans =
       -sin(3*x^2 + 2*x + 1)*(6*x + 2)
      
    y =
       exp(x)/sin(x)
       ans =
       exp(x)/sin(x) - (exp(x)*cos(x))/sin(x)^2
    
    以下是上述计算的Octave等效-
    
    pkg load symbolic
    symbols
    
    x = sym("x");
    y = Exp(x)
    differentiate(y,x)
    
    y = x^9
    differentiate(y,x)
    
    y = Sin(x)
    differentiate(y,x)
    
    y = Tan(x)
    differentiate(y,x)
    
    y = Cos(x)
    differentiate(y,x)
    
    y = Log(x)
    differentiate(y,x)
    
    % symbolic packages does not have this support
    %y = Log10(x)
    %differentiate(y,x)
    
    y = Sin(x)^2
    differentiate(y,x)
    
    y = Cos(3*x^2 + 2*x + 1)
    differentiate(y,x)
    
    y = Exp(x)/Sin(x)
    differentiate(y,x)
    
    八度执行代码并返回以下结果-
    
    y =
    
    exp(x)
    ans =
    
    exp(x)
    y =
    
    x^(9.0)
    ans =
    
    (9.0)*x^(8.0)
    y =
    
    sin(x)
    ans =
    
    cos(x)
    y =
    
    tan(x)
    ans =
    
    1+tan(x)^2
    y =
    
    cos(x)
    ans =
    
    -sin(x)
    y =
    
    log(x)
    ans =
    
    x^(-1)
    y =
    
    sin(x)^(2.0)
    ans =
    
    (2.0)*sin(x)*cos(x)
    y =
    
    cos(1.0+(2.0)*x+(3.0)*x^(2.0))
    ans =
    
    -(2.0+(6.0)*x)*sin(1.0+(2.0)*x+(3.0)*x^(2.0))
    y =
    
    sin(x)^(-1)*exp(x)
    ans =
    
    sin(x)^(-1)*exp(x)-sin(x)^(-2)*cos(x)*exp(x)
    
  • 计算高阶导数

    为了计算函数f的高阶导数,我们使用语法diff(f,n)。
    让我们计算函数y = f(x)= x.e -3x的二阶导数
    
    f = x*exp(-3*x);
    diff(f, 2)
    
    MATLAB执行代码并返回以下结果-
    
    ans =
    9*x*exp(-3*x) - 6*exp(-3*x)
    
    以下是上述计算的 Octave 等效-
    
    pkg load symbolic
    symbols
    
    x = sym("x");
    f = x*Exp(-3*x);
    differentiate(f, x, 2)
    
    执行代码并返回以下结果-
    
    ans =
    
    (9.0)*exp(-(3.0)*x)*x-(6.0)*exp(-(3.0)*x)
    
    - 在这个例子中,让我们解决一个问题。给定一个函数y = f(x)= 3 sin(x)+ 7 cos(5x)。我们将不得不找出方程f'' + f = -5cos(2x)是否成立。
    创建一个脚本文件并在其中键入以下代码-
    
    syms x
    y = 3*sin(x)+7*cos(5*x);  % defining the function
    lhs = diff(y,2)+y;        %evaluting the lhs of the equation
    rhs = -5*cos(2*x);        %rhs of the equation
    if(isequal(lhs,rhs))
       disp('Yes, the equation holds true');
    else
       disp('No, the equation does not hold true');
    end
    disp('Value of LHS is: '), disp(lhs);
    
    运行文件时,它显示以下结果-
    
    No, the equation does not hold true
    Value of LHS is: 
    -168*cos(5*x)
    
    以下是上述计算的 Octave 等效-
    
    pkg load symbolic
    symbols
    
    x = sym("x");
    y = 3*Sin(x)+7*Cos(5*x);           % defining the function
    lhs = differentiate(y, x, 2) + y;  %evaluting the lhs of the equation
    rhs = -5*Cos(2*x);                 %rhs of the equation
    
    if(lhs == rhs)
       disp('Yes, the equation holds true');
    else
       disp('No, the equation does not hold true');
    end
    disp('Value of LHS is: '), disp(lhs);
    
    八度执行代码并返回以下结果-
    
    No, the equation does not hold true
    Value of LHS is: 
    -(168.0)*cos((5.0)*x)
    
  • 找出曲线的最大值和最小值

    如果要搜索图形的局部最大值和最小值,则基本上是在函数图上特定位置或符号变量值的特定范围内寻找最高点或最低点。
    对于函数y = f(x),图形上坡度为零的点称为固定点。换句话说,固定点是f'(x)= 0。
    为了找到我们求微分的函数的平稳点,我们需要将导数设置为零并求解方程。
    - 让我们找到函数f(x)= 2x 3 + 3x 2 − 12x + 17 固定的点。
    采取以下步骤-
    首先让我们输入函数并绘制其图。
    
    syms x
    y = 2*x^3 + 3*x^2 - 12*x + 17;   % defining the function
    ezplot(y)
    
    MATLAB执行代码并返回以下图-
    differential
    这是上述示例的 Octave 等效代码-
    
    pkg load symbolic
    symbols
    
    x = sym('x');
    y = inline("2*x^3 + 3*x^2 - 12*x + 17");
    
    ezplot(y)
    print -deps graph.eps
    
    我们的目标是在图上找到一些局部最大值和最小值,因此让我们在图中[-2,2]的间隔内找到局部最大值和最小值。
    
    syms x
    y = 2*x^3 + 3*x^2 - 12*x + 17;   % defining the function
    ezplot(y, [-2, 2])
    
    MATLAB执行代码并返回以下图-
    differential
    这是上述示例的 Octave 等效代码-
    
    pkg load symbolic
    symbols
    
    x = sym('x');
    y = inline("2*x^3 + 3*x^2 - 12*x + 17");
    
    ezplot(y, [-2, 2])
    print -deps graph.eps
    
    接下来,让我们计算导数。
    
    g = diff(y)
    
    MATLAB执行代码并返回以下结果-
    
    g =
       6*x^2 + 6*x - 12
    
    这是上述计算的 Octave 等效代码-
    
    pkg load symbolic
    symbols
    
    x = sym("x");
    y = 2*x^3 + 3*x^2 - 12*x + 17;
    g = differentiate(y,x)
    
    执行代码并返回以下结果-
    
    g =
       -12.0+(6.0)*x+(6.0)*x^(2.0)
    
    让我们求解导数函数g,以获取变为零的值。
    
    s = solve(g)
    
    MATLAB执行代码并返回以下结果-
    
    s =
       1
       -2
    
    以下是上述计算的 Octave 等效代码-
    
    pkg load symbolic
    symbols
    
    x = sym("x");
    y = 2*x^3 + 3*x^2 - 12*x + 17;
    g = differentiate(y,x)
    roots([6, 6, -12])
    
    八度执行代码并返回以下结果-
    
    g =
    
    -12.0+(6.0)*x^(2.0)+(6.0)*x
    ans =
    
      -2
       1
    
    这与我们的情节一致。因此,让我们在临界点x = 1,-2处评估函数f。我们可以使用subs命令在符号函数中替换一个值。
    
    subs(y, 1), subs(y, -2)
    
    MATLAB执行代码并返回以下结果-
    
    ans =
       10
    ans =
       37
    
    以下是上述计算的 Octave 等效代码-
    
    pkg load symbolic
    symbols
    
    x = sym("x");
    y = 2*x^3 + 3*x^2 - 12*x + 17;
    g = differentiate(y,x)
    
    roots([6, 6, -12])
    subs(y, x, 1), subs(y, x, -2)
    ans =
       10.0
    ans =
       37.0-4.6734207789940138748E-18*I
    
    因此,函数f(x)= 2x 3 + 3x 2 − 12x + 17的最小值和最大值在间隔[-2,2]中为10和37。
  • 解微分方程

    MATLAB提供了dsolve命令,用于象征性地求解微分方程。
    dsolve命令用于查找单个方程式解的最基本形式是
    
    dsolve('eqn') 
    
    其中eqn是用于输入方程式的文本字符串。
    它返回带有一组任意常量的符号解,MATLAB将其标记为C1,C2等。
    您还可以指定问题的初始条件和边界条件,作为等式后的逗号分隔列表-
    
    dsolve('eqn','cond1', 'cond2',…)  
    
    为了使用dsolve命令,导数用D表示。例如,将f'(t)= -2 * f + cost(t)之类的方程式输入为-
    'Df = -2 * f + cos(t)'
    高阶导数由D后面的导数顺序表示。
    例如,方程f“(x)+ 2f'(x)= 5sin3x应该输入为-
    'D2y + 2Dy = 5 * sin(3 * x)'
    让我们举一个简单的一阶微分方程示例:y'= 5y。
    
    s = dsolve('Dy = 5*y')
    
    MATLAB执行代码并返回以下结果-
    
    s =
       C2*exp(5*t)
    
    让我们拿一个二阶微分方程的另一个例子为:y“-y = 0,y(0)= -1,y'(0)= 2。
    
    dsolve('D2y - y = 0','y(0) = -1','Dy(0) = 2')
    
    MATLAB执行代码并返回以下结果-
    
    ans =
       exp(t)/2 - (3*exp(-t))/2