数据插值可分为多项式(高次)插值、分段(低次)插值、三角插值等。多项式插值包括Lagrange插值、Aitken插值、Newton插值、Hermite插值,但高次插值会出现Runge现象,因此更多使用分段低次样条插值。
使用最多的为三次样条插值。
yi = spline(x,y,xi)
pp = spline(x,y)
pp = csape(x,y,conds,valconds)
valconds:
'complete' 固定边界条件
'not-a-knot' 非扭结边界条件(默认)
'periodic' 周期边界条件
'second' 自由边界条件
'variational' 自然边界条件
fitobject = fit(x,y,fitType)
fitobject = fit([x,y],z,fitType)
<fitType -- cflibhelp>
FitType | Equation |
---|---|
poly1 | Y = p1*x+p2 |
poly2 | Y = p1x^2+p2x+p3 |
poly21 | Z = p00 + p10x + p01y + p20x^2 + p11x*y |
poly13 | Z = p00 + p10x + p01y + p11xy + p02y^2 + p12xy^2 + p03y^3 |
weibull | Y = abx(b-1)*exp(-a*xb) |
exp1 | Y = aexp(bx) |
exp2 | Y = aexp(bx)+cexp(dx) |
fourier1 | Y = a0+a1cos(xp)+b1sin(xp) |
fourier2 | Y = a0+a1cos(xp)+b1sin(xp)… +a2cos(2xp)+b2sin(2xp) |
gauss1 | Y = a1*exp(-((x-b1)/c1)^2) |
gauss2 | Y = a1exp(-((x-b1)/c1)^2)+a2… exp(-((x-b2)/c2)^2) |
power1 | Y = a*x^b |
power2 | Y = a*x^b+c |
rat02 | Y = (p1)/(x^2+q1*x+q2) |
rat21 | Y = (p1x^2+p2x+p3)/(x+q1) |
sin1 | Y = a1sin(b1x+c1) |
sin2 | Y = a1sin(b1x+c1)+a2sin… (b2x+c2) |
函数 | 说明 |
---|---|
int | 符号函数 |
trapz | 非函数表达式梯形积分 |
quad | 自适应Simpson积分,对非光滑函数最为有效的地低阶积分 |
quadl | 适用于光滑函数,在高精度时比quad更有效 |
quadgk | 对震荡的被积函数最有效,支持无限区间积分,允许积分区间短点有若的奇异性 |
quadv | quad积分函数的向量化版本 |
quad2d | 平面区域的二重积分,为通用的二重积分,可以做变上限、下限积分 |
dblquad | 矩形区域的二重积分 |
triplequad | 长方体区域的三重积分 |
常微分方程求解器比较
求解器 | 刚性 | 算法 | 应用差场合 |
---|---|---|---|
ode45 | 非刚性 | 单步,4-5阶龙格-库塔 | 首选,大多数场合 |
ode23 | 非刚性 | 单步,2-3阶龙格-库塔 | 精度较低场合 |
ode113 | 非刚性 | 多步,1-13阶Adams算法 | 若ode45计算时间长,尝试ode113 |
ode15s | 刚性 | 多步,Gear’s反向数值积分 | 存在质量矩阵时 |
ode23s | 刚性 | 单步,2阶Rosenbrock算法 | 低精度或存在质量矩阵时 |
ode23t | 中等刚性 | 梯形算法 | 中等刚度问题 |
ode23tb | 刚性 | 梯形-反向数值微分两阶段算法 | 低精度或存在质量矩阵 |
ode15i | 完全隐式 | 可以求解完全隐式的常微分方程 | 完全隐式方程 |
使用odefile.m模板求解常微分方程
function varargout = odefile(t,y,flag,p1,p2)
switch flag
case ''
varargout{1} = f(t,y,p1,p2);
case 'init'
[varargout{1:3}] = init(p1,p2);
case 'jacobian'
varargout{1} = jacobian(t,y,p1,p2);
case 'jpattern'
varargout{1} = jpattern(t,y,p1,p2);
case 'mass'
varargout{1} = mass(t,y,p1,p2);
case 'events'
[varargout{1:3}] = events(t,y,p1,p2);
otherwise
error['Unknown flag'];
end
function dydt = f(t,y,p1,p2)
dydt = <在此插入常微分方程>;
function [tspan,y0,options] = init(p1,p2)
tspan = <在此插入求解范围>;
y0 = <在此插入初值>;
options = <在此插入选项设置,可设置为[]>;
function dfdy = jacobian(t,y,p1,p2)
dfdy = <再此插入雅克比矩阵>;
function S = jpattern(t,y,p1,p2)
S = <在此插入雅克比矩阵系数模式>;
function M = mass(t,y,p1,p2)
M = <在此插入质量矩阵>;
function [value,isterminal,direction] = events(t,y,p1,p2)
value = <在此插入时间向量函数>;
isterminal = <在此插入逻辑向量>;
direction = <在此插入方向向量>;