MATLAB求导数的方法
1.数值导数的计算
[问题]求正弦函数的一阶导数和二阶导数
y = sinx
[数学模型]
函数的一阶导数为
y' = cosx
函数的二阶导数为
y'' = -sinx
[算法]求差分函数为diff,对于数值向量,其功能是求后一元素与前一元素之差,如果数值间隔取得足够小,就能表示导数的近似值。
对于符号函数,可用同样的函数diff计算符号导数。
[程序]zyq3_1diff.m如下。
%正弦函数的导数
clear                                  %清除变量
a=0:5:360;                            %度数向量
x=a*pi/180;                            %弧度向量
dx=x(2);                              %间隔(第1个值为零)
y=sin(x);                              %正弦曲线
dy=diff(y)/dx;                        %用差分求导数的近似值
dy=[dy(1),(dy(1:end-1)+dy(2:end))/2,dy(end)];%求平均值
figure                                %创建图形窗口
%plot(x,cos(x),x(1:end-1),dy,'.')      %画导数曲线(数值导数偏左)
%plot(x,cos(x),x(2:end),dy,'.')        %画导数曲线(数值导数偏右)
plot(x,cos(x),x,dy,'.')                %画导数曲线(数值导数适中)
s=sym('sin(x)');                      %定义符号函数
sdy=diff(s);                          %符号导数
ssdy=subs(sdy,'x',x);                  %替换数值
hold on                                %保持图像
plot(x,ssdy,'ro')                      %画导数曲线
legend('公式解','数值解','符号解',4)    %加图例
title('正弦函数的一阶导数')            %标题
d2y=diff(dy)/dx;                        %用差分求导数的近似值
d2y=[d2y(1),(d2y(1:end-1)+d2y(2:end))/2,d2y(end)];%求平均值
figure                                %创建图形窗口
plot(x,-sin(x),x,d2y,'.')              %画导数曲线(数值导数适中)
sd2y=diff(s,2);                        %符号二阶导数
ssd2y=subs(sd2y,'x',x);                %替换数值
hold on                                %保持图像
plot(x,ssd2y,'ro')                    %画导数曲线
legend('公式解','数值解','符号解',4)    %加图例
title('正弦函数的二阶导数')            %标题
[图示]
2.函数极值的计算
[问题]求如下函数的极值
y = x3 – 3x2 + x                            (1)
[数学模型]
求导数
y' = 3x2 – 6x + 1                            (2)
y' = 0,解得
=1.8165,0.1835                        (3)
[算法]将自变量设计为向量,函数设计为内线函数,用max函数和min函数求极大值和极小值。
用fminbnd函数也可求函数的极小值。将原函数定义为负的内线函数,用fminbnd函数求极小值,就是原函数的极大值。
将原函数定义为符号函数,求原函数的导数,利用fzero函数可求导数的零点,从而求原函数的极值。
[程序]zqy3_2diff.m如下。
%函数的极值和导数
clear                                  %清除变量
x=0:0.01:2.5;                          %自变量向量
f=inline('x.^3-3*x.^2+x');            %定义原函数的内线函数
figure                                %开创图形窗口
plot(x,f(x),'LineWidth',2)            %画原函数曲线
grid on                                %加网格
xlabel('\itx','FontSize',16)          %横坐标
title('函数曲线和极值','FontSize',16)  %标题
[ym,im]=max(f(x));                    %求极大值和下标
xm=x(im);                              %求极大值的横坐标
hold on                                %保持图像
plot(xm,ym,'*')                        %画极大值
text(xm,ym,[num2str(xm),',',num2str(ym)],'FontSize',16)%标记极大值
[ym,im]=min(f(x));                    %求极小值和下标
xm=x(im);                              %求极小值的横坐标
plot(xm,ym,'*')                        %画极小值
text(xm,ym,[num2str(xm),',',num2str(ym)],'FontSize',16)%标记极小值
xm=fminbnd(f,0,3);                    %求最小值
plot(xm,f(xm),'o')                    %画极小值
text(xm,0,[num2str(xm),',',num2str(f(xm))],'FontSize',16)%显示极小值
ff=inline('-(x.^3-3*x.^2+x)');        %定义原函数的内线函数
xm=fminbnd(ff,0,3);                    %求最小值
plot(xm,f(xm),'o')                    %画极小值
text(xm,0,[num2str(xm),',',num2str(f(xm))],'FontSize',16)%显示极小值
%return
y=sym('x^3-3*x^2+x')                  %原函数的符号函数
dy=diff(y)                            %求导数
df=inline(char(dy))                    %定义导数的内线函数
x1=fzero(df,0)                        %求零点
x2=fzero(df,2)                        %求零点
stem([x1,x2],[f(x1),f(x2)],'--o')      %画杆线
text(x1,0,[num2str(x1),',',num2str(f(x1))],'FontSize',16)%标记极值
text(x2,0,[num2str(x2),',',num2str(f(x2))],'FontSize',16)%标记极值
[结果]
y =
x^3-3*x^2+x
dy =
3*x^2-6*x+1
df =
    Inline function:
    df(x) = 3*x^2-6*x+1
x1 =
    0.1835
x2 =
1.8165
3.参数方程的导数
[问题]求下面参数方程的一阶导数和二阶导数
                                (1)
                              (2)
[数学模型]
由(1)式得
                              (3)
上式代入(2)式得
y = x x2                              (4)
这是开口向下的抛物线。其导数为
y' = 1 – 2x                              (5)
这是一条直线。由此可得二阶导数
y'' = – 2                              (6)
将(1)式和(2)式对时间求导数
                            (7)
                    (8)
yx的一阶导数为
                        (9)
将(3)式代入上式可得(7)式。上式再对时间求导数
                            (10)
yx的二阶导数为
                          (11)
[算法]将matlab求导xy定义为参数t的符号函数,依次求符号导数。
[程序]zqy3_3diff.m如下。
%参数方程导数的计算
clear                                  %清除变量
x=sym('1/(t+1)');                      %定义x符号函数