004 MATLAB数值微积分

发布于:2024-12-08 ⋅ 阅读:(167) ⋅ 点赞:(0)

 01  函数的极值点

求解一元函数在区间(x1,x2)中极小值点:
x=fminbnd(fun,x1,x2)
 求解初始向量为x0的多元函数极小值点x和对应的极值y
[x,y]=fminsearch(fun,x0)

 02 微积分

1.数值微分:

 一次微分:
 diff(x)

若x是一个向量,则返回[x(2)-x(1) x(3)-x(2)…x(n)-x(n-1)];
若x是一个矩阵,则返回一个矩阵[x(2:m,:)-x(1:m-1,:)](下一行减上一行作为当前行,返回(m-1)*n的矩阵)

n次微分: 
diff(x,n)
 在指定维dim方向进行n次微分:
diff(x,n,dim)

2.函数微分: 

对于函数y=f(x),则为dy/dx=diff(y)/diff(x)

 2.常微分方程

采用龙格-库塔法求解初值常微分方程的函数有:

ode23、ode45、ode113、ode15s、ode23s、ode23t、ode23tb

下面我们用solver来表示所选用的函数

[x,y]=solver(fun,tspan,y0)

其中fun表示函数文件名,tspan表示积分区间,y0表示初始条件,返回的x是自变量数据,y是解形成的矩阵

[x,y]=solver(fun,tspan,y0,options,p1,p2,…)

其中options用于设置算法参数,可通过odeset指令来进行设置算法的绝对误差、相对误差和最大积分步长等,若不进行设置,则用“[]”代替,p1,p2,…是传递给函数文件的参数

%建立函数文件fun4.m。
function dy=fun4(x,y)
dy=2*x*y-(sin(x))*y;
dy=dy(:);建立空矩阵
%再调用函数ode23求解微分方程。
>>[x,y]=ode23(@fun4,[0:0.1:2],1);
>> plot(x,y)
首先建立函数文件fun5.m。
function dy=fun5(x,y)
dy(1)=2*y(2)-(sin(x))*y(1);
dy(2)=cos(x)*exp(-x)-exp(-x)*y(2);
再调用函数ode45求解微分方程。
>>options=odeset('RelTol',1e-4,'AbsTol',[1e-5 1e-4]);   
  %设置相对误差和绝对误差
>>[x,y]=ode45(@fun5,[0 1],[0 1],options);
>>plot(x,y(:,1),'-',x,y(:,2),'-.')

3.数值积分

(1)矩阵法:

用常数近似子区间内的函数曲线

cumsum(x)

当x为向量时,返回第i个元素为向量x的前i个元素和的向量(累加和);

当x为矩阵时,返回一个大小相同的矩阵,其元素为x每列的累积和(按行依次向前累加得到相应的行)。

cumsum(x,dim)

返回元素为指定维方向x元素累积和的矩阵

dim=1时与cumsum(x)等效

>> dx=0.01;
>> x=[0:0.01:1];                
>> y=exp(-x);                   
>> s=cumsum(y)*dx;     
>> s(end)
ans =
    0.6390

(2)梯形法:

用直线近似子区间内的函数曲线

 trapz(y):

当y为向量时,返回y的积分;当y为矩阵时,返回各列的数值积分

trapz(x,y):返回y对x的数值积分。
trapz(…,dim):返回指定维方向上的积分

 

>> x=[0:0.01:1];                
>> y=exp(-x);                   
>> s=trapz(x,y)     
s =
    0.6321  

(3)Simpson法:

用直线的中点和两端点构成的抛物线近似子区间内的函数曲线。

利用函数quad和quadl,调用格式相同:

 q=quad(fun,a,b,tol,trace,p1,p2,…)
 q=quadl(fun,a,b,tol,trace,p1,p2,…)

其中fun是被积函数;a和b是积分下限和上限;这三个输入参数是必须要有的。tol是算法绝对误差,缺省时取默认值10-6;trace取非零值时,表示随积分进程逐点画出被积函数;p1,p2,…表示向被积函数传送的参数



网站公告

今日签到

点亮在社区的每一天
去签到