MATLAB导数的计算.docx
MATLAB导数的计算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') %画导数曲线 1 legend('公式解','数值解','符号解',4) %加图例 title('正弦函数的二阶导数') %标题 图示 2函数极值的计算 问题求如下函数的极值 y = x3 3x2 + x (1) 数学模型 求导数 y' = 3x2 6x + 1 (2) 令y' = 0,解得 1x=(3±6)=1.8165,0.1835 (3) 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,'*') %画极大值 2 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('x3-3*x2+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 = x3-3*x2+x dy = 3*x2-6*x+1 df = Inline function: df(x) = 3*x2-6*x+1 x1 = 0.1835 x2 = 1.8165 3