先看看,你原来的问题有没有矛盾
如果要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