数学建模社区-数学中国

标题: [分享]插值软件langrang [打印本页]

作者: ilikenba    时间: 2005-3-20 11:55
标题: [分享]插值软件langrang

软件名称:EXCEL自定义插值函数插值计算数值计算. j' `- |% c& T: Q1 R" d& N% c1 Z 版本号: 04y09m28" y7 M; [" | G; T2 A) U; { 分类: 工程设计应用 4 v$ W! P( j8 v4 L( i* N性质: 免费软件2 |) v7 w& b2 \, n0 D1 e) q9 d1 f 使用说明:

; B5 O) W) o* [, S* t# C% ?

人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点: / I" l) L) d# m4 I6 Q1 p, [, q6 K/ U 8 W! H3 [% ?3 t6 A) r2 z, g4 I 1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。

0 Z1 O% |, C+ d2 k

2) 由专业编程语言编制的工程计算应用程序人机界面不友好,常常需要复杂的输入前、输出后处理。

* k4 V& L* Z9 o1 Z4 e

EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。 / q* z( N6 q$ A5 X; X/ X4 Y & p9 H0 S$ ~# P# L* L+ v1 \ 为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。 % ]$ v6 y7 s. D, v+ B单曲线lagrange插值函数:double twlq(double x,char* filename);3 ^: z+ U; z) T$ O$ `3 J& i$ a double twlx(double q,char* filename); # H9 y7 b2 a9 J曲线组lagrange插值函数: ; q4 Y0 V% K/ q, {' j4 H" | double thlq(double x,double y,char* filename); 1 _# m; e* I9 ` double thlx(double y,double q,char* filename);. b4 r& N% Z8 L3 ]; z5 o: D double thly(double x,double q,char* filename);。

* w$ d$ c- Q% `3 D* }" g1 u. N

例:单曲线插值函数 "带路径的保存数据的文件"结构如下:9 V3 y1 f# i! \9 |6 T @ Description @ 7 ~; P9 S) o; { n, nsel; 5 K' o8 G1 Q; r4 nx[0],x[1], x[2],··, x[n-2],x[n-1]; ' J- J, Q) G- Rq[0],q[1], q[2],··, q[n-2],q[n-1]; : N( ]0 T, m8 x2 z! V3 n1 l& r8 |9 rMinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA

; l4 A8 [" F4 h e

注解: a) k, \& b6 @ o( x Description:用户自定义描述字符串(Description中不可有@符号); - P( O) L2 G& r" F- }3 a n: 总插值点个数; 8 a! |' B% o, I nsel:实际参与插值计算的插值点个数;( X, t8 S1 l& U# t$ P; Q2 ? MinX=0.7,MaxX=0.9 取值范围; 7 h/ P! K! ~+ d OverRangeAlm=1 越限报警 1:报, 0:不报;" d, V4 n: x/ \, `# j X=电压,XUnit=mv,变量名称,单位。

4 w% F3 w5 d2 ^, e

****结论:4 ? n6 Q% n% Y# `- {' X3 t l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。 5 h4 y; [6 H0 A- T, D$ D8 v 2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。& j8 N! N/ o! X* U 3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。 7 x( \, }4 d6 S) `& s6 A, C: Y& ~ 4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。

7 g$ `9 _" \- A* A

附含壁温计算,强度计算,热电偶/阻,水阻力,烟气阻力,蒸汽性质等现成数据。

. F" m/ Z3 v( H* T$ `$ U' t$ I [attach]1376[/attach]

[分享]插值软件langrang.zip

419.84 KB, 下载次数: 85, 下载积分: 体力 -2 点

[分享]插值软件langrang


作者: ww991616    时间: 2009-10-28 15:10

作者: ft12345    时间: 2009-11-19 14:29
好东西,谢谢斑竹
作者: xiangzhai83    时间: 2009-11-30 10:23

  1. ' Z* |  ]4 d' S& _% b
  2. /* TODO: Lagrange interpolating
    & r; K; Y; t+ y' Y* t3 e
  3. *
    6 e4 X$ C( v' n1 {
  4. * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?5 X0 J! ~# f6 k9 [1 q! U
  5. * In this situation, it could be solved via lagrange interpolating/ ]$ m) V8 Y. s' L1 |6 P& ]
  6. *
    ' Z$ x+ ~3 J% D% ~- d' T
  7. * */8 B; b) m% Z+ q* X3 e& }3 w2 q
  8. " X* y& H: t. j: Q
  9. #include <stdio.h>% \5 Y# T! r0 B6 T+ K
  10. #include <stdlib.h>  m0 X$ m) H. P8 @/ r0 D5 n. q
  11. #include <string.h>! ~0 \" X$ S, I

  12. % l* V2 O+ V9 }; {
  13. #define DEBUG 0
    ) b' R% ?8 o4 A* ~1 r

  14. / V; ~) c6 Y2 T; k+ n. {
  15. static float m_p = 0.5635;7 O" z* s/ G. R; B  C, t
  16. static char *m_xi = NULL;& y- z" J( M- ]' L" H6 u* Y" J
  17. static char *m_yi = NULL;
    3 i6 J! x& k# k/ y5 u
  18. static float m_arr[] = {};
    6 @: m1 v6 t  t( X
  19. static unsigned int m_n = 0;2 M7 G$ f' M2 y% x+ k9 I

  20. ( a  H# j3 d$ T5 ^
  21. static void m_lagrange_interpolating_usage();
    / J, I" q7 R) _; l' |$ t- I9 `
  22. static int m_lagrange_interpolating_set_n_arr();
    4 N: i5 f) ^9 Z# Z4 }
  23. static float m_lagrange_interpolating();
    3 ?: W* w# l/ l7 u! R: O/ h' |
  24. # B' |) ~" n1 Y4 h
  25. static void
    9 h3 Z9 P# j  G2 a: n
  26. m_lagrange_interpolating_usage()
    7 L; M8 H. E0 f( d7 A
  27. {
    0 W( M3 W6 F% J& K1 U1 Q8 }; L
  28.   printf("Lagrange Interpolating Usage:\n");$ a$ i$ ~! k, {$ e7 J3 Y
  29.   printf("bin/li -p ** -x ** -y **\n");
    7 z" M# ^" K( ^
  30.   printf("-p 0.5635\n");
    . ]6 m5 s. t8 v2 O& l: X& N4 {/ a$ k. j
  31.   printf("-x 0.56160,0.56280,0.56401,0.56521\n");
    , e# |* @7 p$ M5 E& x+ N3 M
  32.   printf("-y 0.82741,0.82659,0.82577,0.82495\n");
    ! H/ O; p! ?& s" F7 n  Q( V
  33. }' N, c# P& D/ [% V4 A+ ]" K

  34. 5 Z$ ?/ P) E* D" b1 {( B4 f
  35. static int
    5 R) N4 F9 J% D
  36. m_lagrange_interpolating_set_n_arr() 7 f$ S7 e' M1 ^$ I8 c
  37. {* h" z  |/ @9 J  `
  38.   int xi_n = 0;
    1 v. B7 E. B- x" X
  39.   int yi_n = 0;
    / u1 v" c+ `8 j9 Q
  40.   int n = 0;
    # U) i, T* h2 s
  41.   char *token = NULL;
    # _8 u/ g0 `7 O2 s7 p! v& v
  42.   const char *delim = ",";. O. y& P/ \+ b4 j, R% z- O
  43. 8 Y3 B- a. t4 i. m- T0 ?
  44.   token = strtok(m_xi, delim);
    + D4 f- f8 t/ O
  45.   while (token)
    # W& ]8 W, l/ Q
  46.   {
    ( f5 u+ R  q* N' k$ z
  47.     xi_n++;
    0 o6 j2 Z0 r' J1 i% L) ]- K/ u
  48.     n++;! K$ h, ?  g4 k; s& z7 o# i% c
  49.     m_arr[n] = (float) atof(token);: Z/ ^+ T4 [7 q0 H
  50.     token = strtok(NULL, delim);
    ' O! N9 b! P+ ]
  51.   }* C$ N8 ?0 Q/ _" V* p7 A' k: T
  52. 1 `2 Y4 O- E3 L
  53.   token = strtok(m_yi, delim);8 B9 C( Q# d6 E
  54.   while (token)
    % m: R2 o3 w0 I" h8 w: y* R
  55.   {8 G( w( z5 j# ]8 w1 H1 {
  56.     yi_n++;* t7 X8 S- s4 M
  57.     n++;- w$ R  e, b) i; s' T* a% a
  58.     m_arr[n] = (float) atof(token);$ n8 Z5 h: S1 `, ]
  59.     token = strtok(NULL, delim);
    1 {% q1 }% o/ F1 i! ^# g
  60.   }( O" ~& d7 n3 ^1 ?8 P) q( n" x
  61.   & B9 v" r0 l7 n
  62.   if (xi_n != yi_n) " L+ T2 ^8 s; r
  63.   {
    5 _  S/ H+ g; H" R7 H/ l/ U4 Q
  64.     return 0;9 E" Y, @' J* G( V! D7 X# Z
  65.   }
    # C. c2 o8 q+ `7 h0 j# s, q- k9 E
  66. , M% I- a7 L& L4 B- s$ M% |3 a
  67.   m_n = xi_n = yi_n;- m8 h/ k; `# E. r: `: R. ]6 F" J

  68. + f9 B1 ^7 S, Q+ I, @7 }
  69.   return 1;3 q! ^( R2 }$ x8 X
  70. }
    % L& j5 m1 ]6 k1 c3 ]5 U1 s

  71. 4 z' o" z& n5 t1 z" D% U
  72. static float
    " x) Q+ N5 w# f. {: `
  73. m_lagrange_interpolating() 2 b, w. f* i$ {* U
  74. {
    ' s1 q* G& z  J. a
  75.   float l = 0.00000;6 H7 A% O" p4 I/ u* Z
  76.   float li;* ^" P# e0 v# z8 V& D
  77.   int i;
    % c! ^5 `" O) Z5 t
  78.   int j;4 v; R' P: k3 k  F( g

  79. ' k0 B, J) _4 H3 B+ G
  80. #if DEBUG4 o  ]& s) l6 `+ }, @/ B9 J7 G6 q8 D
  81.   printf("DEBUG at %d: enable debug mode\n", __LINE__);9 N1 p: E& M  w+ ]
  82.   unsigned int m_n = 3;
    ) i0 Y* ?% c  u- e3 S  l
  83.   float m_p = 0.5635;+ v; b  T4 c3 X5 R
  84.   float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
      Z1 Z/ `9 V+ u% H& z  w
  85.   float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};9 \5 I  G; y$ D" M- ]
  86.   
    & Q+ O- P( v" z& G' v! a. P
  87.   for (i = 0; i < m_n; i++)7 N/ t- v4 e( ^5 h+ n
  88.   {
    ( F6 ?, V2 K% U; ]+ W' w
  89.     li = 1.0000000;
    & U. T' u3 g# |( f* I# X, X! R
  90.     for (j = 0; j < m_n; j++)
    5 |% I8 b7 Q9 W9 y1 _5 }
  91.     {& r; D$ f) e0 L/ z- w
  92.       if (j != i)
    ! X1 [/ i% g% c; P
  93.       {, n& y( }. F. Z) s, c/ p3 f3 Z
  94.         li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);
    7 }; j, u1 n, K' w( h
  95.       }: }+ H" R5 U7 G1 m! n# R
  96.     }
    ; _0 _2 Q  K& A$ w) S4 P
  97.     l = l + li * m_y[i];5 H: K% ^# C1 k+ x$ W( y/ J
  98.   }
    * y  C/ K  C9 T' B/ E
  99. #else
    ' D) a2 ?8 y% p0 n
  100.   if (!m_lagrange_interpolating_set_n_arr())
    : J3 z4 H4 z* A4 I, l" v6 _
  101.   {6 R3 q) i+ O0 V" n! t
  102.     printf("Error: xi and yi counter is diff\n");
    5 E+ n9 N8 s- G% A$ l2 d7 Y) v: W, Y7 R
  103.    
    , ^2 X8 V% i5 u/ |) w* e7 B
  104.     return 0;
    # \+ R% T/ w3 R: p, J# m# k" k
  105.   }% W, k6 e$ _" H( N

  106. 0 x% N$ w/ P. W: p; O# X7 g3 F' o
  107.   for (i = 0; i < m_n; i++) ; J( [' v3 X* s. W# Z1 ~  `& H& t5 T
  108.   {
    ) L: Z/ R$ G( g1 U
  109.     li = 1.0000000;
    & W  O  E8 P% Q- ?4 x: g/ Z( r
  110.     for (j = 0; j < m_n; j++) ' y4 _) V0 D5 H2 U3 v
  111.     {' H6 a) Q$ w4 u  Z7 h, h# b  k+ X- h) X
  112.       if (j != i) + B& i: p# @5 m( d$ [
  113.       {
    & b1 t3 p8 P1 M6 {" t5 M9 d% |
  114.         li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);& a9 `, V$ a3 Z" d; {% R/ k
  115.       }
    , [$ k1 U, q2 m3 {0 q$ G
  116.     }
    " o( O" x0 y4 c5 X' C/ r
  117.     l = l + li * m_arr[i + m_n + 1];1 s; x& O7 B7 J+ V; S* }
  118.   }
    4 R; F9 X. J/ G* j3 I. d3 [
  119. #endif$ i9 D! O6 B& ?' d1 V9 U3 M& o

  120. 2 g: x) }2 ]% A8 i3 F
  121.   return l;' ]8 B# ~; j! \; x. R: U
  122. }# f! O& u( O* y' M( q

  123. 1 r, M- z7 w& D& a& T" {* A8 |
  124. int
    * P3 V! N, }( }8 g' e5 L
  125. main(int argc, char **argv) 7 R; C2 _, }1 }( x9 c0 V/ w
  126. {
    7 P0 s5 d' F7 d' R
  127.   int c;7 `& L3 Q" U* K6 _
  128.   extern char *optarg;# c' [% U, H7 {( ^  V7 U- D
  129.   float res;
    5 J8 B9 a, h! }" z/ f

  130. * a6 J; [9 y' h) z
  131.   if (argc < 2)
    . b1 u" T$ n- U& w  h
  132.   {
    % C4 X4 @+ F9 ]2 J' ~" [8 D
  133.     m_lagrange_interpolating_usage();
    5 K" x- p/ @: ~! q" l5 f$ v* q# j
  134.    
    ) \7 c9 P( ^2 @# R/ g
  135.     return -1;4 c5 n/ b7 p5 A% ?+ X& l  d' S* \8 L
  136.   }& o* h6 b6 @6 R6 V7 ]
  137. 4 J/ f2 O% X3 M
  138.   while ((c = getopt(argc, argv, "p:x:y:")) != -1)
    $ U  ]5 L7 h( ^
  139.   {  A* @/ F. @: c6 c6 j0 U% B3 _6 @
  140.     switch (c) 7 u4 @% y' F2 G! C2 g+ L- Q
  141.     {
    0 A5 z! O4 m5 x+ J6 J
  142.       case 'p':
    8 U) H2 w" U0 _; i3 L( H7 `# m7 L+ I
  143.               m_p = (float) atof(optarg);
    - o3 i* h3 ~3 e- k7 E. r% y+ n
  144.       case 'x':" m2 e4 Z3 C4 @1 m+ O- Q
  145.         m_xi = optarg;' m7 E1 |( A. G0 l
  146.         break;
    ( e0 p; d1 d& r: B* Y" P, i6 s' m
  147.       case 'y':
    3 p# ?+ [5 @: q6 E. R& o
  148.         m_yi = optarg;. m' M! ^! b2 {
  149.         break;; H2 Q( f% ^" V/ M2 }+ ^, {) r
  150.     }+ z& h# ~# e6 o3 s4 n+ ]/ S8 n
  151.   }1 j3 f( y( @; X- ~. ?
  152. 7 G( A+ E5 D5 J  _. h" T! M% o
  153.   res = m_lagrange_interpolating();  R! w/ Q& {3 L) O5 r
  154.   printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);
    0 B. N7 B4 ~8 Y1 w0 w
  155.   8 L* Y; l9 d9 F) F
  156.   return 0;- X* J9 J+ X, ~, I
  157. }
    3 D0 f! }$ b% q- i4 X, [0 X
复制代码

作者: lll111    时间: 2009-11-30 20:38
我要下载。我要下载。我要下载。我要下载。我要下载。我要下载。
作者: xhz-hhu    时间: 2010-7-14 17:14
谢谢谢谢,找了好久呢,谢谢楼主的分享
作者: depht858    时间: 2010-8-31 15:42
谢谢,正需要
作者: hastykeys    时间: 2010-10-16 20:56
谢谢,正需要呢!
作者: 芸芸芸    时间: 2010-10-31 11:53
谢谢,很想看看,没钱啊
作者: mao233    时间: 2014-4-9 22:06
谢谢分享,有了这个插值就方便多了
作者: 也不知道该叫啥    时间: 2014-8-21 10:53
好东西,我很喜欢
作者: 宇仲    时间: 2015-1-22 17:28
楼主辛苦了,继续加油哈!( {# B0 W+ o" \* c! _4 C3 E% w3 Z( P8 X

作者: 1617463814    时间: 2020-4-7 18:30
谢谢分享,先下载来康康~
3 ?2 B% t" B3 f5 G3 ]3 A




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5