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

实验数据和图见水木论坛
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('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');
fun=@(ref,t)((t<=10).*fun1(ref,t)+(t>10).*fun2(ref,t));
abc=nlinfit(t',v,fun,[51891 0.00083 0.00013 12050]');
plot(t,v);hold on;
f=@(t)(fun(abc,t));
fplot(f,[0,50],'r')

该方案不行哦,只要稍微改变初始化条件,拟合结果差距就非常非常大!!!!

你要知道,你要拟合的是一个分段函数,这本身就不是一般的连续光滑函数。
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','x');
fun=@(ref,t)((t<=10).*fun1(ref,t)+(t>10).*fun2(ref,t));
t=0:0.1:50;
v=[3.969
3.963
3.959
3.955
3.952
3.949
3.947
3.945
3.943
3.941
3.939
3.938
3.936
3.935
3.933
3.932
3.93
3.929
3.928
3.927
3.926
3.925
3.923
3.922
3.921
3.92
3.919
3.918
3.917
3.916
3.915
3.914
3.913
3.912
3.911
3.91
3.909
3.908
3.907
3.907
3.906
3.905
3.904
3.903
3.903
3.902
3.901
3.9
3.9
3.899
3.898
3.898
3.897
3.896
3.896
3.895
3.894
3.893
3.893
3.892
3.891
3.891
3.89
3.889
3.889
3.888
3.888
3.887
3.887
3.886
3.886
3.885
3.884
3.884
3.883
3.882
3.882
3.881
3.88
3.88
3.879
3.879
3.878
3.878
3.877
3.877
3.876
3.876
3.875
3.875
3.874
3.874
3.873
3.873
3.872
3.872
3.871
3.87
3.87
3.869
3.869
4.105
4.108
4.11
4.112
4.114
4.115
4.116
4.117
4.118
4.119
4.119
4.12
4.12
4.121
4.122
4.122
4.123
4.123
4.124
4.124
4.124
4.125
4.125
4.126
4.126
4.126
4.127
4.127
4.128
4.128
4.129
4.129
4.129
4.129
4.129
4.13
4.13
4.13
4.13
4.13
4.131
4.131
4.131
4.131
4.132
4.132
4.132
4.132
4.132
4.132
4.133
4.133
4.133
4.133
4.133
4.134
4.134
4.134
4.134
4.134
4.134
4.135
4.135
4.135
4.135
4.135
4.136
4.136
4.136
4.136
4.136
4.137
4.137
4.138
4.138
4.138
4.139
4.139
4.139
4.139
4.139
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.141
4.141
4.141
4.141
4.141
4.141
4.141
4.141
4.141
4.141
4.142
4.142
4.142
4.142
4.142
4.142
4.142
4.142
4.142
4.142
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156];
abc=nlinfit(t',v,fun,[51891 0.00083 0.00013 12050]');
plot(t,v);hold on;
f=@(t)(fun(abc,t));
fplot(f,[0,50],'r')
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-08-20
使用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的变数。
第2个回答  2019-07-30
使用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的变数。
相似回答