matlab分段拟合问题

2025-06-22 18:34:25
推荐回答(1个)
回答1:

先看看,你原来的问题有没有矛盾


如果要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