| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 747 人关注过本帖
标题:求助,有重谢
只看楼主 加入收藏
细品咖啡
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2005-9-27
收藏
 问题点数:0 回复次数:9 
求助,有重谢
603 Newton插值功能
       给出n个节点及相应的函数值x1,x2,…,xn;y1,y2,…,yn,
   对m个插值节点xj,j=1,2,…,m,用Newton插值多项式进行成组
   插值.
一. 算法简介
       对已知n个节点及相应处函数值yi=f(xi),I=1,2,…,n,构
   造不超过n-1次的插值多项式Φn-I(x),近似代替f(x).
       当n=3时,就是构造不超过二次的插值多项式
          Φ2(x)=A1+A2(x-x1)+A3(x-x1)(x-x2)      (6-5)
       由插值条件T2(x1)=f(x1)=y,得A1=y1.再利用插值条件
   T2(x2)=y2,可得:
          A2=[f(x2)-f(x1)]/(x2-x1)=f(x2,x1)     (6-6)
   式(6-6)右端f(x2,x1)是个记号,称为函数f(x)在x1,x2的一阶
   差商,或一阶均差,再利用T2(x3)=y3,可得
       A3=[f(x2)-f(x1)]/[(x3-x1)(x3-x2)]
           -[(x3-x1)f(x2,x1)]/[(x3-x1)(x3-x2)]
         =[f(x3,x1)-f(x1,x2)]/(x3-x1)=f(x1,x2,x3)     (6-7)
   式(6-7)右端f(x1,x2,x3)是个记号,称为函数f(x)在x1,x2,x3
   的二阶差商或二阶均差,它是一阶均差的均差,将A1,A2,A3代入
   式(6-5)即得Newton二次插值多项式.
       当n>3时,我们进行推广,假定已有n-2阶差商,可递归地定
   义n-1阶差商f(x1,x2,…,xn)=
         [f(x1,x2,…,xn-1)-f(x1,x2,…,xn)]/(x1-xn)
       由此可写出n-1阶Newton插值多项式
     Φn-1=f(x1)+(x-x1)f(x1,x2)+(x-x1)(x-x2)f(x1,x2,x3)+…
            (x-x1)…(x-xn-1)f(x1,x2,…,xn)       (6-8)
       用Φn-1(x)近似代替f(x),其误差如下:
       设f(x)∈C^n-1[a,b],f^n(x)在[a,b]上存在,其中[a,b]是
   包含x1,x2,…,xn在内的任意区间,则对任意给定的x∈[a,b]总
   存在一点C∈(a,b)且与x有关,使
       Rn-1(x)=f(x)-Tn-1(x)=f^n(C)*W(x)/n!     (6-9)
   其中W(x)=(x-x1)(x-x2)…(x-xn).该误差公式应用起来有一定
   困难,因为实际上f(x)往往不知道.可用时候估计去估计误差.
二. 程序使用说明
1. 输入参数
n  节点个数
  m  插值点个数
  X(N),Y(N),一维实数组,分别存放节点及节点处的函数值
  C(M) 一维实数组,存放插值点的值
  数据排列顺序:x(n),y(n),c(m),分别存放在主程序250-270中
2. 输出参数
n,m分别为节点个数,插值点个数
  X(N),Y(N),一维实数组,分别存放节点及节点处的函数值
  C(M),D(M),一维实数组,分别存放插值点及值
  当运行程序后,输入:
6 7
1.0000  2.0000  3.0000  4.0000  5.0000  6.0000
8.0000  27.0000  64.0000  125.0000  216.0000  343.0000
0   1.5   2.5   3.5   4.5   5.5   7
 则运行结果为:
x=0.0000000000e+00     y=1.0000000000e+00
x=1.5000000000e+00     y=1.5625000000e+01
x=2.5000000000e+00     y=4.2875000000e+01
x=3.5000000000e+00     y=9.1125000000e+01
x=4.5000000000e+00     y=1.6637500000e+02
x=5.5000000000e+00     y=2.7462500000e+02
x=7.0000000000e+00     y=5.1200000000e+02
basic源程序:
10  '**************
20  '603 Newton *
30  '**************
40  INPUT "n,m=";N,M
50  PRINT;TAB(3);"n=";N,"m=";M
60  DIM X(60),Y(60),C(M),D(M)
70  PRINT TAB(3);
80  FOR I=1 TO N
90  READ X(I):PRINT USING"  ###.####";X(I);
100 NEXT I
110 PRINT
120 FOR I=1 TO N
130 READ Y(I):PRINT USING"   ###.####";Y(I);
140 NEXT I
150 PRINT
160 FOR J=1 TO M
170 READ C(J)
180 NEXT J
190 PRINT
200 GOSUB 400
210 PRINT TAB(3);
220 FOR J=1 TO M
230 PRINT "X=";C(J),"Y=";D(J)
240 NEXT J
250 DATA 1,2,3,4,5,6
260 DATA 8,27,64,125,216,343
270 DATA 0,1.5,2.5,3.5,4.5,5.5,7
280 END
400 '子程序
410 FOR L=2 TO N
420  FOR I=N TO L STEP-1
430  Y(I)=(Y(I-1)-Y(I))/(X(I-L+1)-X(I))
440  NEXT I
450 NEXT L
460 FOR J=1 TO M
470 D(J)=0
480  FOR I=1 TO N
490  S=1
500  IF I=1 THEN 540
510   FOR L=1 TO I-1
520   S=S*(C(J)-X(L))
530   NEXT L
540  D(J)=D(J)+S*Y(I)
550  NEXT I
560 NEXT J
570 RETURN
搜索更多相关主题的帖子: 插值 多项式 Newton 节点 函数 
2005-09-27 13:45
likk
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2005-9-15
收藏
得分:0 
你是哪里人?????????
2005-09-27 13:54
细品咖啡
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2005-9-27
收藏
得分:0 
陕西咸阳,你呢
2005-09-27 16:34
细品咖啡
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2005-9-27
收藏
得分:0 
能帮忙做吗?谢了
2005-09-27 16:40
ningzhong
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2005-9-4
收藏
得分:0 
比较简单

2005-09-27 23:47
瑶瑶
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-27
收藏
得分:0 
各位大大 谁能帮我也解道题呀@@!!!

ωǒ喜歡? 纏綿啲ー種 感覺﹌ 彼此ニ深愛鈳苡 選擇壹輩子吥離開妳
2005-09-27 23:55
细品咖啡
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2005-9-27
收藏
得分:0 
大哥,真的很简单吗,那你有时件帮我做一下啊,谢谢了,我真的是急用
2005-09-28 07:38
wenyong
Rank: 1
等 级:新手上路
帖 子:251
专家分:0
注 册:2005-8-9
收藏
得分:0 
haha 为作业吧!

2005-09-28 08:49
jackrain
Rank: 1
等 级:新手上路
帖 子:182
专家分:0
注 册:2005-9-4
收藏
得分:0 

/*---------------------------------------------- *--------------------Newton 插值--------------- *--------------------09 - 28 - 2005------------ *------------------Test with C-Free 3.5 ------- *---------------------------------------------*/ #include <stdio.h> #include <stdlib.h>

void newton(float*X, float* Y, float* C, float *D, int N, int M); void main(int argc, char*argv[]) { int N , M , i; float *X, *Y, *C, *D; if(argc != 3) { do{ printf("Please Input 2 Numbers:(f.e:10 15)"); fflush(stdin); } while(scanf("%d %d", &N, &M) != 2);

} else { N = atoi(argv[1]); M = atoi(argv[2]); } printf("N = %d, M = %d\n", N, M); if((X = (float*)malloc(sizeof(float) * 2 *(N + M))) == NULL) { printf("malloc Failure!\nProgram terminate!\n"); system("pause"); exit(0); } Y = X + N; C = Y + N; D = C + M; i = 0; while(1) { if(i == N) break; printf("please input X[%d]:", i+1); if(scanf("%f" , X+i) == 1) i++; } i = 0; while(1) { if(i == N) break; printf("please input Y[%d]:", i+1); if(scanf("%f" , Y+i) == 1) i++; } i = 0; while(1) { if(i == M) break; printf("please input C[%d]:", i+1); if(scanf("%f" , C+i) == 1) i++; } for(i = 0; i < M; i++) *(D + i) = 0; newton(X, Y, C, D, N, M); for(i = 0; i < M; i++) printf("x = %0.10e y = %0.10e\n", C[i], D[i]); free(X); system("pause"); } void newton(float*X, float* Y, float* C, float *D, int N, int M) { int i, j, L; float S = 1; for(L = 1; L < N; L++) for(i = N - 1; i >= L; i--) Y[i] = (Y[i-1] - Y[i])/(X[i-L] - X[i]); for(j = 0; j < M; j++) { D[j] = Y[0]; for(i = 1; i < N; i++) { S = 1; for(L = 0; L <= i-1; L++) S *= (C[j] - X[L]); D[j] += S*Y[i]; } } }

[此贴子已经被作者于2005-9-28 9:53:22编辑过]


程序和身体一样,健壮,再健壮! 我爱C++
2005-09-28 09:51
细品咖啡
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2005-9-27
收藏
得分:0 
太谢谢你了,大哥。我好感动啊,你的QQ多少啊?我要加你
2005-09-28 12:16
快速回复:求助,有重谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018343 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved