如何用matlab拟合模型分段函数

来源:百度知道 编辑:UC知道 时间:2024/07/16 15:34:05
实验数据和图见水木论坛
http://www.newsmth.net/bbscon.php?bid=191&id=132630
有一组实验数据,t表示时间,v表示电压
数据如后所见。

我现在编写一个m文件,试图分段拟合,但得不到预期的效果。如果是分开拟合,则效果很好。估计是这样编写的分段拟合不对,请大侠指教更好的程序。

下面是我编写的m文件
fun1=inline('4.213-300*x/ref(1)-300*(ref(2)+ref(3))+300*ref(3)*exp(-x/(ref(3)*ref(4)))','ref','x')
fun2=inline('4.213-3000/ref(1)-300*ref(3)*exp(-x/(ref(3)*ref(4)))*(exp(10/(ref(3)*ref(4)))-1)','ref','x')
if t<=10
abc=nlinfit(t,v,fun1,[51891 0.00083 0.00013 12050]);
else

abc=nlinfit(t,v,fun2,[51891 0.00083 0.00013 12050]);
end

Cb=abc(1),R0=abc(2),Rp=abc(3),Cp=abc(4)
if t<=10
vv=4.213-300*t/Cb-300*(R0+Rp)+300*Rp*exp(-t/(Rp*Cp))
else
vv=4.213-3000/Cb-300*Rp*exp(-t/(Rp*Cp))*(exp(10/(Rp*Cp))-1)
end
plot(t,v,'*',t,vv)
fun1=inline(

使用1stOpt:
Parameter b,a,k,m;

Variable x,y;
Function y = if(x<b,a,k*x+m);
Data;
1 11.3
2 11
3 11
4 10.9
5 10.8
6 13
7 15
8 17
9 19
10 21

结果:

均方差(RMSE): 0.104425867986634
残差平方和(RSS): 0.109047619047619
相关系数(R): 0.999580949469544
相关系数之平方(R^2): 0.999162074542434
决定系数(DC): 0.999162074542434

参数 最佳估算
---------- -------------
b 4.37864959356375
a 11.0500000018819
k 2.02857142843666
m 0.752380952272692

b实际上为一小于5的变数。

你要知道,你要拟合的是一个分段函数,这本身就不是一般的连续光滑函数。
nlinfit之所以要有初值这一项,就是考虑到在某些变态的情况下,无法找到最小二乘函数的最小值,可能是一个局部的最小值,也可能根本找不到,所以有必要通过改变迭代初值的方法进行试验。对于这种分段函数,最好的方法还是分段拟合。

fun1=inline('4.213-300*x/ref(1)-300*(ref(2)+ref(3))+300*ref(3)*exp(-x/(ref(3)*ref(4)))','ref','x');
fun2=inline('4.213-3000/ref(1)-300*ref(3)*exp(-x/(ref(3)*ref(4)))*(exp(10/(ref(3)*ref(4)))-1)','ref'