2019年3月15日 星期五

C語言 例題1-8 已知5點的座標值 使用牛頓差除表 (外插法) 求P(1.5) P(2.5)之值=?

C語言 例題1-8 已知5點的座標值 使用牛頓內插法
            利用外插法求P(1.5)  P(2.5)之值=?

輸入資料
n=4
0.0        0.0
1.0        -3.0
2.0        0.0
3.0        15.0
4.0        48.0



輸出結果
 Divided Difference Table:
 =================================
i        x(i)     f(i)    f(i,i+1)   f(i,i+1.i+2),  ......
0       0.0      0.0     -3.0       3.0            1.0      0.0 
1       1.0     -3.0      3.0       6.0            1.0 
2       2.0      0.0     15.0      9.0 
3       3.0     15.0    33.0 
4       4.0     48.0 

因為P(1.5)的外差法
所以以 i=2到i=4共三點的牛頓差除表 0.0     15.0      9.0 得到
P(x)=0.0 + 15.0 (x-2.0) + 9.0 (x-2.0)(x-3.0)

將 1.5帶入上式中P(1.5)= -0.75 
與 f(x)=x^3 - 4x = -2.625 誤差很大 因為外差點離[x0,xn]太遠

將 2.5帶入上式中P(2.5)= 5.25 
與 f(x)=x^3 - 4x = 5.625  誤差還是比內插法大 外差點離[x0,xn]遠

利用Lagrange 與 Newton 內插法得到的方程式是相同的





程式

/* ex1-9.c is for developing the divided-defference
 * table for Newton Interpolation polynomial.
 */
#include <stdio.h>
void main()
{
   int i,j,n;
   double f[40][40],x[40];
   scanf("n=%d",&n);
   for(i=0;i<=n;i++)
   {
      scanf("%lf %lf ",&x[i],&f[i][0]);
   }
   printf("\n Divided Difference Table:\n");
   printf(" =========================\n");
   for(j=1;j<=n;j++)
   {
      for(i=0;i<=n-j;i++)
      {
  f[i][j]=(f[i+1][j-1]-f[i][j-1])/(x[i+j]-x[i]);
      }
   }
   printf("i   x(i)     f(i)    f(i,i+1) f(i,i+1.i+2),  ......\n");
   for(i=0;i<=n;i++)
   {
      printf("%d  %8.1lf ",i,x[i]);
      for(j=0;j<=n-i;j++)
      {
  printf("%8.1lf ",f[i][j]);
      }
      printf("\n");
   }
   return;

}

沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...