24小时热门版块排行榜    

查看: 2101  |  回复: 28
本帖产生 2 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

sudo

木虫 (正式写手)

[交流] 【致H兄】数列题的万能多项式拟合求法 已有2人参与

中秋快到了无心工作,就娱乐一下吧~

不知道是怎么回事的虫友请看这个帖子:
http://muchong.com/bbs/viewthread.php?tid=3573558&fpage=0&view=&highlight=&page=1

分析也在那个帖子里面啦,就不多说了,放MATLAB代码:
CODE:
function av = myPolyFit(y)
%A * av = y
    n = length(y);
    y = y(:); %make `y` a column vector
   
    %construct `A`
    A = (1:n)' * ones(1,n);
    for j = n-2 :-1: 1
        A(:,j) = A(:,j) .* A(:,j+1);
    end
    A(:,n) = ones(n,1);
   
    av = A\y;

其中y是序列,av是所找到的多项式的系数。

就以H兄的题目为例子吧
22   26   ()   23   24    21  ()    18

括号里面的数据可以乱填,比如这里就都填20吧,那么就有这段MATLAB程序:
CODE:
y=[22 26 20 23 24 21 20 18];
av=myPolyFit(y);
n=1:0.001:9;
val=polyval(av, n);
poly2str(av, 'n')
plot(n, val)

输出的多项式为:
CODE:
   0.0047619 n^7 - 0.18889 n^6 + 3.025 n^5 - 25.1806 n^4 + 116.3583 n^3
   - 293.6306 n^2 + 365.6119 n - 144

输出的图为:


[ Last edited by sudo on 2011-9-9 at 16:13 ]
回复此楼

» 本帖已获得的红花(最新10朵)

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangww2011

木虫 (著名写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
xzhdty(金币+2): 中秋快乐,欢迎常来 2011-09-09 23:09:51
引用回帖:
6楼: Originally posted by sudo at 2011-09-09 19:42:55:
这个拟合出来的式子也可以无限长啊

哦,莫非你觉得不是整数不爽?简单改改就行:

把n从0开始计数,设给定的数列长度为N-1,同理使用上面的方法得到一个多项式F(n)之后,再令

f(n) = F(n mod N)

不就 ...

不是这个意思,举个例子(这台电脑上的MATLAB被卸载了,就用Mathematica来说明吧),譬如数列:
CODE:
-1,1,-1,1,-1,1,-1,1,...

有 a(n)=(-1)^n
CODE:
FindSequenceFunction[{-1, 1, -1, 1, -1, 1, -1, 1}, n]

结果为
CODE:
(-1)^n

有了这个通项公式后,可以轻易的知道a(50)=1,a(51)=-1,...
但是如果用多项式拟合,
CODE:
InterpolatingPolynomial[{-1, 1, -1, 1, -1, 1, -1, 1}, x] // Expand

结果为
CODE:
-255 + (64864 x)/105 - (2856 x^2)/5 + (12056 x^3)/45 - 70 x^4 + (464 x^5)/45 - (4 x^6)/5 + (8 x^7)/315

如果另
CODE:
y(x)=-255 + (64864 x)/105 - (2856 x^2)/5 + (12056 x^3)/45 - 70 x^4 + (464 x^5)/45 - (4 x^6)/5 + (8 x^7)/315

可以知道y(1)到y(8)都是符合给定序列的,但是
y(50)=10158083585
y(51)=11832465919
就不符合了,所以多项式拟合不靠谱
希望我表达清楚了

[ Last edited by wangww2011 on 2011-9-9 at 20:15 ]
11楼2011-09-09 20:14:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 29 个回答

huycwork

金虫 (著名写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
xzhdty(金币+2): 欢迎常来程序语言看看 2011-09-09 23:08:48
余泽成: 你们都是高手,惺惺相惜啊,哈哈! 2011-09-09 23:38:20
侬这动静闹得这般震撼,风口浪尖儿的
一般情况下如果等差数列,比如1 2 3 4 5 6。
俺表示淡定,说,这个用一个项就可以得出答案了!
Matlab表示淡定,想,sudo同学给了俺一个段儿呢!
计算机表示淡定,合计着,啥时把Matlab调过来,请sudo吃个月饼,一顿饭就解决了!
广大虫友表示淡定,这有啥,这方法不是那儿有嘛!
出考题的老师表示不够淡定,啥?六次方!
漩涡的中心有一块空地,空空的。
2楼2011-09-09 17:51:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangww2011

木虫 (著名写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
xzhdty(金币+1): 中秋快乐! 2011-09-09 23:09:05
引用回帖:
1楼: Originally posted by sudo at 2011-09-09 16:11:12:
中秋快到了无心工作,就娱乐一下吧~

不知道是怎么回事的虫友请看这个帖子:
http://muchong.com/bbs/viewthread.php?tid=3573558&fpage=0&view=&highlight=&page=1

分析也在那 ...

中秋快乐!

你这个纯多项式拟合不靠谱,因为这是局部的拟合,而实际上那个数列可以无限长的啊
3楼2011-09-09 18:03:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)


小木虫(金币+0.5):给个红包,谢谢回帖
送鲜花一朵
余泽成(程序强帖+1): 鼓励交流! 2011-09-09 23:39:00
依我看,待定系数法就差不离了,能解决90%以上此类题,分两类,一类是指数式:
f2n = ab^n
另外一类是多项式,这个最高项由数据的多数决定,上面的式子占去两个参数,剩下的就归它:
f1n = an^3+bn^2+cn+d
将两类混合在一起建立方程,就是:
fn = ab^n+cn^3+dn^2+en+f
然后代入自然数列出求解矩阵,剩下的就是解方程组的工夫了。
漩涡的中心有一块空地,空空的。
4楼2011-09-09 18:39:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见