Matlab与数值计算基础

数值计算基础

数据插值


数据插值可分为多项式(高次)插值、分段(低次)插值、三角插值等。多项式插值包括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'       自然边界条件

数据拟合


  • 工具箱:cftool + Code Generation
  • 函 数:fit
    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 = <在此插入方向向量>;

你可能感兴趣的:(Mathematics,Matlab,数值计算)