MATLAB数值微分

定义:在微分学中,函数的导数是通过极限来定义的,如果一个函数是用数值给出的离散形式,那么他的导数就无法用极限运算求得,当然也就无法用求导的方式去计算函数在某点的导数,这就需要采用数值微分的方法,用离散方法近似计算函数在某点的导数值

MATLAB数值微分_第1张图片

MATLAB数值微分_第2张图片

%两种方式计算f(x)在给定点x的数值倒数,
% 第一种是利用多项式f(x)进行逼近,用逼近函数的倒数求解x处的倒数
%第二种是利用f(x)在x处的差商作为其倒数,

% matlab中不能直接计算其数值倒数,但是可以计算前向差分,函数为diff
%DX=diff(X) 计算向量x的前向差分
%DX=diff(X,n)  计算X的n阶前向差分

%example:设x由[0,2*pi]间均匀分布的80个点组成,求sinx的1~3阶差分
X=linspace(0,2*pi,80);
Y=sin(X);
DY=diff(Y);
DY%一阶差分
D2Y=diff(Y,2);
D2Y

DYval=DY/(2*pi/80);%求一阶差商

plot(X,cos(X),'--k');
grid on;
hold on;

plot(X,[DYval,1],'b');
grid on;
legend('导数','数值导数')

MATLAB数值微分_第3张图片

例题:

MATLAB数值微分_第4张图片
%三种方法
%1 用高次多项式拟合函数f,再对拟合函数求导,得到函数值
%2 直接求取假设点的数值导数(差商)
%3 先求出f'(x),再代入点求解导数值
f=@(x) sqrt(x.^3+2*x.^2-x+12)+(x+5).^(1/6)+5*x+2;
g=@(x) (3*x.^2+4*x-1)./sqrt(x.^3+2*x.^2-x+12)/2+1/6./(x+5).^(5/6)+5;
x=-3:0.01:3;
p0=polyfit(x,f(x),8);
dp=polyder(p0);
dpx=polyval(dp,x);%第一种方法

dx=diff(f([x,3.01]))/0.01;%第二种方法

g=g(x);%第三种方法
plot(x,dpx,'--k',x,dx,'b',x,g,'r');
grid on;
leggend('多项式拟合求导','数值导数','解析导数');

MATLAB数值微分_第5张图片

你可能感兴趣的:(matlab,开发语言)