yuhuihui 发表于 2009-5-5 10:08

我做曲线拟合,明明原本散点图是曲线,拟合出来却是直线

我做曲线拟合,明明原本得到的散点图趋势是曲线,拟合出来却是直线,并没有二次项和一次项,为什么哦?不都是这样拟合的么?

%%w自变量,z因变量
clc; clear;
N=5120; T=10;t=linspace(0,T,N);
m1=17.248; m2=34.496; m3=17.248;
m11=46.347; m22=54.238; m33=89.096;
w1=57.158;w2=131.05;w3=157.92;
for w=40:0.1:170
q1=2.9973*(500*sin(28579/500*t)*w-28579*sin(w*t))/(500*w-28579)/(500*w+28579);
q2=0.05032*(20*sin(2621/20*t)*w-2621*sin(w*t))/(20*w-2621)/(20*w+2621);
q3=0.0100*(25*sin(3948/25*t)*w-3948*sin(w*t))/(25*w-3948)/(25*w+3948);
x=0.294*q1+q2+0.775*q3; y=20*log10(abs(x)); z=max(y);
plot(w,z,'r'); hold on;
end
%%%%%%到此,出来是散点图
%%%添加如下代码
p=polyfit(w,z,2); wi=200:0.05:550; zi=polyval(p,wi);
plot(wi,zi)
%%%%出来却是多了一条毫不沾边的直线!

请指教啊!

[ 本帖最后由 ChaChing 于 2009-5-5 10:57 编辑 ]

ChaChing 发表于 2009-5-5 11:10

回复 楼主 yuhuihui 的帖子

1.LZ的w/z仅是一个值!?
2.w范围为40~170, 拟合wi范围为200~500!?

[ 本帖最后由 ChaChing 于 2009-5-5 11:15 编辑 ]

friendchj 发表于 2009-5-5 11:12

我认为的几处错误(参见红色部分),呵呵,和楼上的意见一致:
%%w自变量,z因变量
clc; clear;
N=5120; T=10;t=linspace(0,T,N);
m1=17.248; m2=34.496; m3=17.248;
m11=46.347; m22=54.238; m33=89.096;
w1=57.158;w2=131.05;w3=157.92;
i=1;      %% new %%
for w=40:0.1:170
q1=2.9973*(500*sin(28579/500*t)*w-28579*sin(w*t))/(500*w-28579)/(500*w+28579);
q2=0.05032*(20*sin(2621/20*t)*w-2621*sin(w*t))/(20*w-2621)/(20*w+2621);
q3=0.0100*(25*sin(3948/25*t)*w-3948*sin(w*t))/(25*w-3948)/(25*w+3948);
x=0.294*q1+q2+0.775*q3; y=20*log10(abs(x));
z(i)=max(y); plot(w,z(i),'r'); hold on;i=i+1;   %% new %%
end
%%%%%%到此,出来是散点图
%%%添加如下代码
w=(40:0.1:170 )'; z=z';   %% new %%
p=polyfit(w,z,2); wi=200:0.05:550; zi=polyval(p,wi);
plot(wi,zi)
%%%%出来却是多了一条毫不沾边的直线!

[ 本帖最后由 ChaChing 于 2009-5-5 18:59 编辑 ]

yuhuihui 发表于 2009-5-5 18:00

回复 板凳 friendchj 的帖子

不好意思,我看不到哪里是用红色标明的,只明白一点我没有加循环,而且不应该一会儿w范围为40~170, 拟合wi范围为200~500。
本人只是使用matlab这个工具,在matlab上是非常菜的。
我不明白“w=(40:0.1:170 )';
z=z';
p=polyfit(w,z,2); wi=200:0.05:550; zi=polyval(p,wi);
plot(wi,zi)”
这一段什么意思啊?加那个转置干什么?这段话该怎样表示才对呢?

yuhuihui 发表于 2009-5-5 18:01

回复 沙发 ChaChing 的帖子

恩,因为没有i循环,确实不对

wi的范围也不对

头大啊。

yuhuihui 发表于 2009-5-5 18:09

请问怎样改才可以呢?
w有一组数
z对应也有一组数

对w和z拟合怎么样才对呢?

ChaChing 发表于 2009-5-5 18:54

原帖由 yuhuihui 于 2009-5-5 18:09 发表 http://www.chinavib.com/forum/images/common/back.gif
请问怎样改才可以呢? ...
3F

红色标明处已特别作记号

[ 本帖最后由 ChaChing 于 2009-5-5 19:00 编辑 ]

yuhuihui 发表于 2009-5-5 21:57

可是还是不对...

[ 本帖最后由 yuhuihui 于 2009-5-5 22:09 编辑 ]

friendchj 发表于 2009-5-5 22:49

回复 8楼 yuhuihui 的帖子

请详细说明,呵呵

friendchj 发表于 2009-5-11 21:20

clc
clear
N=5120; T=10; t=linspace(0,T,N);
m1=17.248; m2=34.496; m3=17.248;
m11=46.347; m22=54.238; m33=89.096;
w1=57.158;w2=131.05;w3=157.92;
i=1; %% new %%
for w=40:0.1:170
q1=2.9973*(500*sin(28579/500*t)*w-28579*sin(w*t))/(500*w-28579)/(500*w+28579);
q2=0.05032*(20*sin(2621/20*t)*w-2621*sin(w*t))/(20*w-2621)/(20*w+2621);
q3=0.0100*(25*sin(3948/25*t)*w-3948*sin(w*t))/(25*w-3948)/(25*w+3948);
x=0.294*q1+q2+0.775*q3; y=20*log10(abs(x));
z(i)=max(y); i=i+1; %% new %%
end
%%%%%%到此,出来是散点图
%%%添加如下代码
w=(40:0.1:170 )'; z=z'; %% new %%
p=polyfit(w,z,2);
w1=40:5:170;
z1=polyval(p,w1);
plot(w,z,'r'); hold on;
plot(w1,z1,'o')
legend('原始数据','拟合数据')

不知道为何你的不显示拟合曲线?

yuhuihui 发表于 2009-5-11 22:02

谢谢friendchj 。
可是拟合后,为什么峰值都没有了呢?
拟合的那个结果好像不对啊...
拟合后的曲线不是应该和原曲线一致的么?

yuhuihui 发表于 2009-5-11 22:03

我一直认为拟合是让拟合后的曲线比原曲线更光滑...
难道不是么?

friendchj 发表于 2009-5-11 22:10

回复 12楼 yuhuihui 的帖子

拟合只是找出源数据的函数关系,如果要想光滑,应该进行插值操作。对于你的数据,在40-170这个范围内,数据不符合二次多项式的形式,因此用二次多项式拟合,结果也肯定不对。

yuhuihui 发表于 2009-5-11 22:35

哦,明白些了,那我是应该做插值了啊?!
我先自己看看能不能搞定,不能的话,还麻烦friendchj以及各位老大指教!

ChaChing 发表于 2009-5-12 08:24

参考下
【资源共享】MATLAB曲线拟合向导(Curve Fitting Toolbox) by octopussheng
http://forum.vibunion.com/forum/thread-49726-1-1.html
页: [1] 2
查看完整版本: 我做曲线拟合,明明原本散点图是曲线,拟合出来却是直线