- 论坛徽章:
- 0
|
Lagrange Interpolating拉格郎日插值法仅仅用线性逼近非线性,但是,我的方法让计算精度完全丢失了,请大家帮帮看看
SVN地址:
https://sirch.svn.sourceforge.ne ... -analysis/lagrange/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define DEBUG 1
- static float m_p = 0.5635;
- static char *m_xi = NULL;
- static char *m_yi = NULL;
- static float m_arr[] = {};
- static unsigned int m_n = 0;
- static void m_lagrange_interpolating_usage();
- static int m_lagrange_interpolating_set_n_arr();
- static float m_lagrange_interpolating();
- static void
- m_lagrange_interpolating_usage()
- {
- printf("Lagrange Interpolating Usage:\n");
- printf("bin/li -p XXX -x XXX -y XXX\n");
- printf("-p 0.56350\n");
- printf("-x 0.56160,0.56280,0.56401,0.56521\n");
- printf("-y 0.82741,0.82659,0.82577,0.82495\n");
- }
- static int
- m_lagrange_interpolating_set_n_arr()
- {
- int xi_n = 0;
- int yi_n = 0;
- int n = 0;
- char *token = NULL;
- const char *delim = ",";
- token = strtok(m_xi, delim);
- while (token)
- {
- xi_n++;
- n++;
- m_arr[n] = (float) atof(token);
- token = strtok(NULL, delim);
- }
- token = strtok(m_yi, delim);
- while (token)
- {
- yi_n++;
- n++;
- m_arr[n] = (float) atof(token);
- token = strtok(NULL, delim);
- }
-
- if (xi_n != yi_n)
- {
- return 0;
- }
- m_n = xi_n = yi_n;
- return 1;
- }
- static float
- m_lagrange_interpolating()
- {
- float li = 0.00000;
- float l = 0.00000;
- int i;
- int j;
- #if DEBUG
- printf("DEBUG at %d: debug mode\n", __LINE__);
- unsigned int m_n = 4;
- float m_p = 0.5635;
- float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
- float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};
- for (i = 0; i < m_n; i++)
- {
- for (j = 0; j < m_n; j++)
- {
- if (j != i)
- {
- li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);
- }
- }
- l = l + li * m_y[i];
- }
- #else
- if (!m_lagrange_interpolating_set_n_arr())
- {
- printf("Error: xi and yi counter is diff\n");
-
- return 0;
- }
- for (i = 0; i < m_n; i++)
- {
- for (j = 0; j < m_n; j++)
- {
- if (j != i)
- {
- li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);
- }
- }
- l = l + li * m_arr[i + m_n + 1];
- }
- #endif
- return l;
- }
- int
- main(int argc, char **argv)
- {
- int c;
- extern char *optarg;
- float res;
- if (argc < 2)
- {
- m_lagrange_interpolating_usage();
-
- return -1;
- }
- while ((c = getopt(argc, argv, "p:x:y:")) != -1)
- {
- switch (c)
- {
- case 'p':
- m_p = (float) atof(optarg);
- case 'x':
- m_xi = optarg;
- break;
- case 'y':
- m_yi = optarg;
- break;
- }
- }
- res = m_lagrange_interpolating();
- printf("Lagrange interpolating with %.5f result is %.5f\n", m_p, res);
-
- return 0;
- }
复制代码 |
|