matlab分段拟合问题
先看看,你原来的问题有没有矛盾
如果要x=8的时候,两个函数相等,那么明显有 c*log10(8/10)=0
明显只有c=0的时候才成立,那么函数前后两端表达式一模一样,就不需要分段了
如果硬是要分两段,两端在x=8处的值相等,那么只能是两端的a,b不是相同的
那函数就不只是a,b,c 三个参数了
如果把函数条件改一下,改成以下那样
就不会矛盾,因为log10(8/8)=0,那样在x=8时两条表达是才能统一
y
=
a
+
b*log10(x)
x<=8
y
=
a
+
b*log10(8)
+
c*log10(x/8)
x>=8
这样的话,就可以设置一个分段函数fun对数句拟合
x
=
[1
2
3
4
5
6
7
8
9
10
15
20
25
30
35
40
45
50
55
60];
y
=
[39.4
39.2
49.2
49.6
43.8
49
49.6
44.6
48.6
50
48.4
54
52.4
56.4
62.4
57
59.2
61.6
64
59.4];
fun=@(p,x)
(p(1)+p(2)*log10(x))+p(3)*log10(x/8).*(x>=8);
%匿名函数fun代表分段函数
pp=nlinfit(x,y,fun,[0
1
1])
%拟合,得到pp(1)=a,pp(2)=b,pp(3)=c
xx=min(x):max(x);%画图看拟合结果
plot(x,y,'ko');hold
on;
%黑点原来的数据
plot(xx,fun(pp,xx),'r-');hold
off;%红线拟合的函数曲线
pp
=
40.4580
8.2405
7.3904
就是a=40.458
b=8.2405
c=7.3904