免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2492 | 回复: 1
打印 上一主题 下一主题

[C] 拉格郎日插值法的计算精度完全丢失 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-23 16:33 |只看该作者 |倒序浏览
Lagrange Interpolating拉格郎日插值法仅仅用线性逼近非线性,但是,我的方法让计算精度完全丢失了,请大家帮帮看看

SVN地址:
https://sirch.svn.sourceforge.ne ... -analysis/lagrange/


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define DEBUG 1

  5. static float m_p = 0.5635;
  6. static char *m_xi = NULL;
  7. static char *m_yi = NULL;
  8. static float m_arr[] = {};
  9. static unsigned int m_n = 0;

  10. static void m_lagrange_interpolating_usage();
  11. static int m_lagrange_interpolating_set_n_arr();
  12. static float m_lagrange_interpolating();

  13. static void
  14. m_lagrange_interpolating_usage()
  15. {
  16.   printf("Lagrange Interpolating Usage:\n");
  17.   printf("bin/li -p XXX -x XXX -y XXX\n");
  18.   printf("-p 0.56350\n");
  19.   printf("-x 0.56160,0.56280,0.56401,0.56521\n");
  20.   printf("-y 0.82741,0.82659,0.82577,0.82495\n");
  21. }

  22. static int
  23. m_lagrange_interpolating_set_n_arr()
  24. {
  25.   int xi_n = 0;
  26.   int yi_n = 0;
  27.   int n = 0;
  28.   char *token = NULL;
  29.   const char *delim = ",";

  30.   token = strtok(m_xi, delim);
  31.   while (token)
  32.   {
  33.     xi_n++;
  34.     n++;
  35.     m_arr[n] = (float) atof(token);
  36.     token = strtok(NULL, delim);
  37.   }

  38.   token = strtok(m_yi, delim);
  39.   while (token)
  40.   {
  41.     yi_n++;
  42.     n++;
  43.     m_arr[n] = (float) atof(token);
  44.     token = strtok(NULL, delim);
  45.   }
  46.   
  47.   if (xi_n != yi_n)
  48.   {
  49.     return 0;
  50.   }

  51.   m_n = xi_n = yi_n;

  52.   return 1;
  53. }

  54. static float
  55. m_lagrange_interpolating()
  56. {
  57.   float li = 0.00000;
  58.   float l = 0.00000;
  59.   int i;
  60.   int j;

  61. #if DEBUG
  62.   printf("DEBUG at %d: debug mode\n", __LINE__);
  63.   unsigned int m_n = 4;
  64.   float m_p = 0.5635;
  65.   float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
  66.   float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};

  67.   for (i = 0; i < m_n; i++)
  68.   {
  69.     for (j = 0; j < m_n; j++)
  70.     {
  71.       if (j != i)
  72.       {
  73.         li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);
  74.       }
  75.     }
  76.     l = l + li * m_y[i];
  77.   }
  78. #else
  79.   if (!m_lagrange_interpolating_set_n_arr())
  80.   {
  81.     printf("Error: xi and yi counter is diff\n");
  82.    
  83.     return 0;
  84.   }

  85.   for (i = 0; i < m_n; i++)
  86.   {
  87.     for (j = 0; j < m_n; j++)
  88.     {
  89.       if (j != i)
  90.       {
  91.         li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);
  92.       }
  93.     }
  94.     l = l + li * m_arr[i + m_n + 1];
  95.   }
  96. #endif

  97.   return l;
  98. }

  99. int
  100. main(int argc, char **argv)
  101. {
  102.   int c;
  103.   extern char *optarg;
  104.   float res;

  105.   if (argc < 2)
  106.   {
  107.     m_lagrange_interpolating_usage();
  108.    
  109.     return -1;
  110.   }

  111.   while ((c = getopt(argc, argv, "p:x:y:")) != -1)
  112.   {
  113.     switch (c)
  114.     {
  115.       case 'p':
  116.               m_p = (float) atof(optarg);
  117.       case 'x':
  118.         m_xi = optarg;
  119.         break;
  120.       case 'y':
  121.         m_yi = optarg;
  122.         break;
  123.     }
  124.   }

  125.   res = m_lagrange_interpolating();
  126.   printf("Lagrange interpolating with %.5f result is %.5f\n", m_p, res);
  127.   
  128.   return 0;
  129. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2008-05-27 17:22 |只看该作者
啊啊啊,天,公式中的Li的初始值搞错了


  1.    for (i = 0; i < m_n; i++)
  2.   {
  3.     li = 1.0000000;
  4.     for (j = 0; j < m_n; j++)
  5.     {
  6.       if (j != i)
  7.       {
  8.         li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);
  9.       }
  10.     }
  11.     l = l + li * m_arr[i + m_n + 1];
  12.   }
复制代码


https://sirch.svn.sourceforge.ne ... ange-interpolating/
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP