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)
y对x的一阶导数为
(9)
将(3)式代入上式可得(7)式。上式再对时间求导数
(10)
y对x的二阶导数为
(11)
[算法]将matlab求导x和y定义为参数t的符号函数,依次求符号导数。
[程序]zqy3_3diff.m如下。
%参数方程导数的计算
clear %清除变量
x=sym('1/(t+1)'); %定义x符号函数
发布评论