线性拟合polyfit_非线性方程求根amp;曲线拟合

一. 非线性方程的求解:
roots(返回所有的即n个根)、fzero(一般只能有一个,通过迭代生成收敛到一个根)、fsolve%新版本
1.非线性方程:包括代数方程和含三角函数指数函数或其他超越函数。
1)roots:解代数方程,无法解超越方程。
多项式方程求根,p是次数由高到低排列的多项式系数
p = [3 -2 -1];%p表示次数由高到低排列的多项式的系数,相当于
r = roots(p);%求n个根
2)fzero:解绝大多数方程。
fun = @(x) x.^2-4*sin(x);
r = fzero(fun,pi/2)
3) solve命令也可以求解(warning):
syms x;%声明符号函数变量
eqn = (x + 2)^x == 2;%赋方程
s = solve(eqn,x)%解方程,返回方程的根
2.用数值方法求解非线性方程的步骤:
①找出隔根区间(只含一个实根的区间)
②近似根的精确化
一般方法:二分法、不动点迭代法、Newton迭代法
1)二分法:以区间宽度小与容许误差来判断趋近的终点
function [x,n] = bisection(f,a,b,tol)%f是函数,[a,b]是求解区间,tol是精度
%输出x是方程的近似根,n是迭代步数。
2)不动点迭代法:
将连续函数方程
function [root,n] = fixpoint(phai,x0,tol)
if (nargin == 2)tol = 1.0e-5;
end
err = 1;
root = x0;
n = 0;
while (err > tol)n=n+1;r1=root;root=phai(r1);err=abs(root-r1);
end
输入:
ph=@(x) (1 + x)^(1 / 3);%这里输入的是φ(x)
[root,n] = fixpoint(ph,1)
- 不动点迭代法的收敛性:
设迭代过程收敛于方程的根,若迭代误差
- 收敛定理:若
在
的某邻域连续,且
,则不动点迭代法
局部收敛。
一般需要构造性迭代,选择适当的函数,尽量收敛速度较大。
3)Newton法
基本思想:利用非线性函数的泰勒展开的线性部分去近似函数本身,线性化处理。代数变换后即
function main
x0 = 1.5;
[fun,dfun] = fun0(x0);%调用子函数
i = 1;
while abs(x1 - x0)>1e-5x0=x1;[fun,dfun] = fun0(x0);x1 = x0-fun/dfun;i = i + 1;
end
disp('the solution is x1='),x1
disp('the iter time is'),i
function[fun,dfun] = fun0(x)
fun=x^3-x-1;
dfun=3*x^2-1;
4.简化的Newton迭代:
公式变形:
二. 插值与拟合
1.插值:用所有的离散数据确定函数表达式的方法。
- 缺点:如果数据存在观测误差或噪声,那么可能确定的函数并不是最佳的函数
代数插值问题理论基础:插值存在唯一性定理(系数构成Vandermonde行列式)
- 龙格现象:多项式的次数越多需要的数据就越多,预测就越准确。插值次数越高,插值结果越偏离原函数。高次插值结果并不可靠。
- 如何避免龙格现象:分段线性插值(保证了局部特性,但在节点处不光滑)、分段三次插值/样条插值(既能保证局部特性又能保证光滑性)
插值函数:
1)一维插值函数:
yq = interpl(x,y,xq,'method')%x向量是样本点,y向量是样本点对应值,向量xq是查询点,
%向量yq是函数在查询点的估计值,method表示采用的插值方法,包括linear和spline,缺省时默认为线性插值。
2) 二维插值函数:
vq = interp2(x,y,v,xq,yq,'method')
2.拟合:
- 优点:可以消除局部波动
主要方法:最小二乘法。
曲线拟合:拟合计算要解决的基本问题是:根据给定的观测值x预测
参数求解:高斯拟合原理、最小二乘法:
即满足
拟合函数:
- 多项式拟合函数:polyfit+多项式求值函数:polyval+作图(散点用'o',直线用'r'之类的)
调用格式:
p=polyfit(x,y,n)%x,y为数据点,n位多项式阶数(n可以大于最适宜拟合阶数的值,不能小与),返回p为幂次从高到低的多项式系数向量
y=polyval(p,x)%返回对应自变量x在给定系数P的多项式的值
注:指数拟合可以化为多项式/线性拟合。
- 指数函数可以用来描述事物增长或衰减的规律:入放射性原子核、血液中药物和酒精的衰变规律等。
- 对于非线性拟合函数,如果无法转化成熟悉的多项式拟合,也可以用非线性拟合函数lsqcurvefit直接求解
beta = lsqcurvefit(fun,beta0,xdata,ydata)%beta为求解的非线性拟合函数系数,xydata为给定数据,
%fun为自定义的拟合函数。beta0为待定系数的初始值
- 如何选取初值[1]:
- 如果已知数学模型,有一定物理意义,则建议根据物理意义选取。
- 如果无法确定初值,且你的数学模型有导数(如果求导模型很复杂甚至没有导数,则可进行简单的差分构造),则可以采取如下的办法进行:
- 求出拟合函数的n(如无特殊条件n一般为1)阶导数。
- 使用已知数据求出近似点的一阶导数。
- 代入一阶导数函数以及原函数求得初值近似值。
symfun(___)把符号函数当作函数来用。//而sym(_____)的话必须 要sub
参考
- ^引自 http://blog.163.com/shikang999@126/blog/static/172624896201463111856714/