声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2369|回复: 14

[编程技巧] 求教:三次多项式曲线

[复制链接]
发表于 2006-9-14 11:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我用matlab的三次多项式画出了曲线,但是曲线尾处呈陡降趋势,想要把曲线尾处变成平缓趋于0的曲线,请问高手如何下手阿?本人不胜感激!

[ 本帖最后由 ericlin 于 2006-9-18 21:22 编辑 ]
回复
分享到:

使用道具 举报

发表于 2006-9-14 16:20 | 显示全部楼层
set(gca,'XScale', 'log')
更换成对数坐标
 楼主| 发表于 2006-9-14 20:22 | 显示全部楼层

在线等,急急

对于回帖先表示感谢了,其实我的曲线本来是通过公式得出的,然后通过下面的程序拟合,但是仿真出来后发现曲线和实际不符合,想修正一下,把尾部的陡降,变成趋向于0,请问大虾,我是不是要修改y中的数据,一步一步的趋近阿?还有其他办法吗?请指点。在线等
x=[0.5:0.1:2];
y=[0.39664 0.24624 0.13724 0.063503 0.018869 -0.0028101 -0.007685 -0.0019063 0.0083751 0.017009 0.017844 0.0047299 -0.028484 -0.087948 -0.17981 -0.31023];
b=polyfit(x,y,3)
x1=0.46:.01:2.04;
fy=b(1)*x1.^3+b(2)*x1.^2+b(3)*x1+b(4);
plot(x,y,'ko',x1,fy,'markerfacecolor','k','linewidth',2)
axis tight
 楼主| 发表于 2006-9-14 22:14 | 显示全部楼层
x=[0.5:0.01:2];
y=[0.39664 0.37956 0.36295 0.34681 0.33112 0.31588 0.30109 0.28673 0.27281 0.25931 0.24624 0.23358 0.22132 0.20947 0.19802 0.18695 0.17627 0.16596 0.15602 0.14645 0.13724 0.12838 0.11987 0.1117 0.10386 0.09635 0.08916 0.082289 0.075726 0.069466 0.063503 0.057831 0.052445 0.047337 0.042501 0.037932 0.033624 0.029569 0.025763 0.022198 0.018869 0.01577 0.012894 0.010235 0.008787 0.0072445 0.006405006 0.0051494 0.00391404 0.0028998 0.00220328101 0.00209523 0.0020326 0.0020018357571 0.001951764321 0.00190636 0.00185579 0.00180147621 0.00175591 0.00170784 0.00165685 0.001601085 0.00155147 0.00150901 0.0014575 0.00140429 0.0013526 0.00130926 0.00125191 0.0012083 0.001159063 0.0011034 0.00105461 0.001008515 0.00095103 0.00090530559 0.000851158 0.00080351838 0.000750262538 0.00070173196 0.000653751 0.000601094141 0.0005543 0.0005000811418 0.0004512371 0.0004013282 0.0003514147 0.0003014958 0.0002515709 0.0002016395 0.0001517009 0.0001017545 0.0000517996 0.000018358 0.000018223 0.000018186 0.000018039 0.000017978 0.0000178596 0.00001778287 0.0000176844 0.000017262 0.000017034 0.0000165654 0.000016017 0.000015515 0.000015043 0.000014595 0.0000140639 0.0000135443 0.000013047299 0.0000125024145 0.000012010806 0.0000115028439 0.000011057992 0.000010589801 0.000010012393 0.000009516043 0.00000919938 0.000008524083 0.0000080484 0.000007533148 0.00000703808 0.000006543287 0.000006048775 0.0000055455 0.000005060619 0.00000466987 0.00000407366 0.000003580645 0.000003087948 0.000002595575 0.000002010353 0.000001511183 0.0000012046 0.00000052945 0.0000015879 0.0000014849 0.0000013855 0.0000012899 0.0000011981 0.0000010102 0.0000009262 0.000000821461 0.000000722701 0.000000623982 0.000000525304 0.000000426669 0.0000003277 0.000000298 0.0000013];
b=polyfit(x,y,3)
x1=0.46:.01:2;
fy=b(1)*x1.^3+b(2)*x1.^2+b(3)*x1+b(4);
plot(x,y,'k',x1,fy,'markerfacecolor','k','linewidth',2)
axis tight

以上程序是曲线拟合,可是相差比较大,最好了多项式拟合,因为我需要各项系数,哪位大侠出手相助阿,小妹在此恭候阿,先谢谢了
发表于 2006-9-14 22:36 | 显示全部楼层
原帖由 sincereFSO 于 2006-9-14 22:14 发表
x=;
y=;
b=polyfit(x,y,3)
x1=0.46:.01:2;
fy=b(1)*x1.^3+b(2)*x1.^2+b(3)*x1+b(4);
plot(x,y,'k',x1,fy,'markerfacecolor','k','linewidth',2)
axis tight

以上程序是曲线拟合,可是相差比较大,最好了 ...



b=polyfit(x,y,3) 改为4或者5就可以了,三次的话恐怕难以做到。

另外,fy=b(1)*x1.^3+b(2)*x1.^2+b(3)*x1+b(4);语句可更简洁地写成fy=polyval(b,x1);

评分

1

查看全部评分

发表于 2006-9-15 02:38 | 显示全部楼层
嗯,cftool计算得到的结果中4和5次的结果残差均比较小,以下为5次的参数:
Linear model Poly5:
       f(x) = p1*x^5 + p2*x^4 + p3*x^3 + p4*x^2 + p5*x + p6
Coefficients (with 95% confidence bounds):
       p1 =     -0.1122  (-0.1658, -0.05854)
       p2 =       1.247  (0.9113, 1.583)
       p3 =      -4.937  (-5.748, -4.127)
       p4 =       9.075  (8.136, 10.01)
       p5 =      -7.891  (-8.41, -7.373)
       p6 =       2.624  (2.515, 2.733)

Goodness of fit:
  SSE: 0.001419
  R-square: 0.9989
  Adjusted R-square: 0.9989
  RMSE: 0.003128
=================================================
1stopt中我随便选了一个拟合公式库中的函数算了一下:
...
Function: y = (p1+p2*x+p3*x^2+p4*x^3+p5*x^4+p6*x^5)^2
...
R-Square: 0.999822989654528
Determination Coef. (DC): 0.999771955096217

Parameters Name        Parameter Value
===============        ===============
p1              1.08984503047167
p2              -0.207316689211218
p3              -2.05068983356183
p4              1.1617349438493
p5              0.255140400813106
p6              -0.184502255267234
===========================================
总体后者比较好用,不过对此问题而言二者基本区别不大(增大项次数到7次cftool的残差也能到0.9998以上)但是从一般应用角度,感觉两者都够了。

[ 本帖最后由 bainhome 于 2006-9-15 02:40 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2006-9-15 09:04 | 显示全部楼层

在线等,急急

感谢这么多好心人前来相助,这个还有一个要求就是拟合后的曲线要都〉0,用5次拟合还是有〈0的地方,这个还可以怎么修改阿?
 楼主| 发表于 2006-9-16 09:36 | 显示全部楼层

高手出马阿

通过多次多项式拟合,虽然曲线趋近了,但是如果x扩大到5或者更高的话,曲线尾部就不趋于0了,却变的很大,请问高手有什么方法解决阿,难道是多项式拟合是不能实现的吗?
发表于 2006-9-16 10:12 | 显示全部楼层
什么叫“变得很大”?
这是7次曲线数据+图象,没感觉有多大。
Linear model Poly7:
       f(x) = p1*x^7 + p2*x^6 + p3*x^5 + p4*x^4 + p5*x^3 +
                    p6*x^2 + p7*x + p8
Coefficients (with 95% confidence bounds):
       p1 =      0.8434  (0.6802, 1.007)
       p2 =       -8.09  (-9.519, -6.661)
       p3 =       32.11  (26.89, 37.34)
       p4 =      -67.65  (-77.96, -57.34)
       p5 =       80.18  (68.34, 92.02)
       p6 =      -51.51  (-59.4, -43.61)
       p7 =       15.04  (12.22, 17.86)
       p8 =      -0.928  (-1.345, -0.5109)

Goodness of fit:
  SSE: 0.0002652
  R-square: 0.9998
  Adjusted R-square: 0.9998
  RMSE: 0.001362

[ 本帖最后由 bainhome 于 2006-9-16 10:13 编辑 ]
linetu.jpg
 楼主| 发表于 2006-9-16 10:31 | 显示全部楼层

非常感谢

你那个图沃搞出来了,只是横坐标再加大的话,纵坐标就不是无限趋于0了。
发表于 2006-9-16 10:37 | 显示全部楼层
你这张图是用你4楼给的数据拟合的???,该数据最大到2,你的bmp图里2到3之间的数据是怎么回事儿?
如果你想用2以下的数据拟合出的公式去预测2到3之间的,那我的建议是您应该看看关于拟合的基本理论——它的预测性在很多情况下是不存在的。
另外,多项式的拟合功能有限,用非线性公式nlinfit,lsqcurvefit等试试,如果没有基本公式的模型或者初值难以预测,改用1stopt,但是无论哪一种方式,请把你所有的数据都用上。

[ 本帖最后由 bainhome 于 2006-9-16 10:40 编辑 ]
 楼主| 发表于 2006-9-16 10:43 | 显示全部楼层
对,我的数据只有那么多,但是想用有限的数据预测更大的区间,而且目的就是想趋于0,才符合实际。不知哪个方法更适合这种想法。
 楼主| 发表于 2006-9-16 10:51 | 显示全部楼层
a= – 0.000545λ2 + 0.002λ – 0.0038                    
        b=  0.00628λ2 – 0.0232λ + 0.0439                  
        c= – 0.028λ2 + 0.101λ – 0.18                           
        d= – 0.228λ3 + 0.922λ2 – 1.26λ + 0.719      
          hE=5
         τ= a•hE3 + b•hE2 + c•hE +d                 
AS=4.4961*τ
通过以上公式可以仿出λ=0.5~2的图形,但是在1以后曲线低于0,因此需要修正此曲线,使其与已有公式相似,但是低端趋于0,这才符合实际,因此我采用多项式拟合解决不了,请教大侠有什么更好的方法呢,非常感谢!
发表于 2006-9-16 10:56 | 显示全部楼层
数据拟合出公式然后进行预测据我所知也是一个试探的过程,哪个好哪个不好难以一言蔽之,不过如果就这么百来个数据构成的样本,我想无论哪种拟合也无法一次性精确实现预测并满足用户的要求,所以建议用1stopt的拟合公式库,寻找多个残差满足要求的公式,在MATLAB中挨个试探其在2~3之间的吻合性,由于拟合与数值逼近理论比较多,牵扯面也比较广,我想我所说也未必十分准确,仅供参考。
BTW:你想实现的目的,在你前面的帖子里表达的非常糟糕,5~6个回合之后才让人知道你到底要干什么。这对于解答者的时间,也是一种浪费,建议您注意提问的技巧。

[ 本帖最后由 bainhome 于 2006-9-16 11:18 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2006-9-17 08:41 | 显示全部楼层
非常感谢这么多好心人的热情帮助,也谢谢指点我发帖技巧的那位好心人,由于是新手,请见谅,下次一定注意
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-20 00:24 , Processed in 0.089802 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表