数学建模社区-数学中国

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

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

软件名称:EXCEL自定义插值函数插值计算数值计算 0 ]3 D. h) p& `2 ~: q# s- m0 N* U* q版本号: 04y09m28 . b# H; e; m" b9 O* i6 P分类: 工程设计应用 , r1 Y* Y5 f% r4 D, r8 |性质: 免费软件! [' r4 i* d% Z) y 使用说明:

7 I' s+ j5 i! ]* L* U( H% A

人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点: 2 s! ]& S# w$ Q. ] 9 H5 n/ ?* ` J9 Z9 U. S 1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。

* P9 c' H$ J3 [0 i% V

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

4 `" C* ^, y- ]2 @6 a6 w

EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。& {: O* k( E2 t" Y1 f7 c ; X) O/ u9 [2 t7 ^0 z, Q. V6 V 为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。* }$ ?: t* a6 S" r. F 单曲线lagrange插值函数:double twlq(double x,char* filename); 4 P9 K) r/ J o) m( k double twlx(double q,char* filename); 5 U0 q: n; U+ y, R, T4 W& O6 j2 a, D曲线组lagrange插值函数: ' f$ i4 m; ~% u0 r double thlq(double x,double y,char* filename);- j4 s0 {/ G1 _5 a- l# k double thlx(double y,double q,char* filename); n8 h& y: p* y: a2 `6 d double thly(double x,double q,char* filename);。

5 ^* s# O1 ?* `+ O+ p

例:单曲线插值函数 "带路径的保存数据的文件"结构如下: 6 t: t" s) a1 |+ i/ g, A) q% A, P@ Description @ ! l+ U$ u4 L7 z, a7 E7 x n, nsel; 1 _' M5 y: [/ R: x7 Nx[0],x[1], x[2],··, x[n-2],x[n-1];& e% ^2 I" ]$ n. {+ J3 O" N; P q[0],q[1], q[2],··, q[n-2],q[n-1]; # P% G0 A. Y+ z- u, d% l R5 mMinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA

N; o' Z$ s2 y2 \7 x. G

注解:/ S5 K. @4 b2 T" I( D4 n4 b Description:用户自定义描述字符串(Description中不可有@符号); 0 f1 }5 `$ p g3 x n: 总插值点个数;+ Z" n& a+ |' k- t# N6 j0 y nsel:实际参与插值计算的插值点个数;2 g w& _1 I% O& K1 f) ^ MinX=0.7,MaxX=0.9 取值范围;1 |2 c& p6 |% p% i OverRangeAlm=1 越限报警 1:报, 0:不报; 9 \* {! ^/ O m- P6 y E9 B3 _ X=电压,XUnit=mv,变量名称,单位。

6 d1 J$ o7 j- \8 k

****结论:4 Q" ~0 w$ K* m l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。 ! H' S/ S! R% s" g9 y; K9 l 2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。& G: [+ T/ p) \% d: i4 ]' V 3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。4 D8 B% `) L O1 Y 4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。

6 D1 d! T* \& d+ I& K

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

! a! o7 w1 q7 p# @5 ~& M[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. 4 a& i/ D: K; T! |
  2. /* TODO: Lagrange interpolating
    2 s! ~& B: e: ^$ @% z/ O3 p
  3. ** M0 H! |6 S. A9 d
  4. * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?
    8 l  }( M; T! _: l; @3 g0 v
  5. * In this situation, it could be solved via lagrange interpolating
    + y* p+ R9 p6 `  K. [8 N! d: y
  6. *
    ; U  q; @8 p# @1 T1 I
  7. * */+ `/ P3 R; a+ i  [- P: t
  8. 0 y. L3 n# d% `  C1 N
  9. #include <stdio.h>
    ' Y7 k8 M) s, ], H
  10. #include <stdlib.h>
    % w* O, H. H! J: K4 y
  11. #include <string.h>% k$ {: x) ^$ a( `  {& H! B: G
  12. - d0 }7 Z; R8 s: q
  13. #define DEBUG 0) F& j* V; k9 a% P: ~" f
  14.   R; u7 i! o  y
  15. static float m_p = 0.5635;
    4 e& S' A9 {, N6 r0 n
  16. static char *m_xi = NULL;  O( d3 A* h) `" _: J
  17. static char *m_yi = NULL;" P& l% ~3 A. `3 @+ F+ V: B: W
  18. static float m_arr[] = {};
      @& M1 y* E/ m* [" L
  19. static unsigned int m_n = 0;# ~* |9 l8 n/ }, ^0 S$ K( X" a1 i

  20. $ u3 H! I* G. \/ H" M7 F
  21. static void m_lagrange_interpolating_usage();
    # O5 a" |* g  o/ ?$ }, _( ?
  22. static int m_lagrange_interpolating_set_n_arr();: N3 \% s3 Q" i% ]* Z
  23. static float m_lagrange_interpolating();
    % r/ v7 J9 A6 Q, |7 J  @
  24. & p1 p# ^% J* `
  25. static void ) n, p8 D, q+ V2 X7 v) Y
  26. m_lagrange_interpolating_usage()
    ) W# ^( ^" n$ w2 n: T
  27. {* @& ]5 c. c) ^+ Y. b
  28.   printf("Lagrange Interpolating Usage:\n");
    6 ?0 r5 J7 w/ J+ d$ p. H; X
  29.   printf("bin/li -p ** -x ** -y **\n");
    . K; m+ Q0 ~* c" N* Y7 u( z4 x$ S
  30.   printf("-p 0.5635\n");5 ]- ?0 ^% ^3 m. z' j. b
  31.   printf("-x 0.56160,0.56280,0.56401,0.56521\n");
    4 e- P; j. [* |8 S
  32.   printf("-y 0.82741,0.82659,0.82577,0.82495\n");- |6 ]( t  h, C5 l8 Q/ D. a
  33. }5 e+ ]. A8 r/ d' [& g/ a

  34. 1 B  y$ P+ A( Y& S) z) r& E3 T0 b
  35. static int 1 u4 z1 W# E9 |2 g. o, a0 T5 g) u
  36. m_lagrange_interpolating_set_n_arr() & Y! R7 V* h+ O& P3 N
  37. {
    3 {. c; I& ]) S& x4 w
  38.   int xi_n = 0;& h$ x# z2 A% Z4 }: K3 ]
  39.   int yi_n = 0;
    & h# M9 L5 J1 `; o
  40.   int n = 0;) G! l$ F- `  v6 R8 y0 @
  41.   char *token = NULL;4 z" v( d! |& {) G0 M
  42.   const char *delim = ",";4 G3 _: s$ v. L6 u

  43. : P7 u# g4 ~) d. D
  44.   token = strtok(m_xi, delim);0 M. ^- ]; Y: F# m# H
  45.   while (token)
    ! t+ N& Z# k% L+ t; ]( t. j  t  b
  46.   {
    8 c* b8 I/ l9 D$ G
  47.     xi_n++;0 f6 p6 }$ H' f( a
  48.     n++;; C9 R- B1 i$ D. l- m6 l  _1 h
  49.     m_arr[n] = (float) atof(token);! O1 b, {+ E$ g( i+ A/ d2 h
  50.     token = strtok(NULL, delim);
    - d$ B. p4 H5 \" i3 Y2 ]& S9 P
  51.   }) }8 u' ^4 f5 s

  52. ; }+ k" Q9 g9 v: r& ]' R
  53.   token = strtok(m_yi, delim);
    : S; L. \- F! o  [
  54.   while (token)
    - z$ U) Z% s& q* b% g
  55.   {9 M4 p% P% \+ f3 O# a0 E5 a) T
  56.     yi_n++;, x4 \8 M8 W  h7 Z0 k+ a2 o
  57.     n++;9 p8 D: E4 i' m( I6 B% ^+ G
  58.     m_arr[n] = (float) atof(token);
    # j& ^: ?- R; O  D$ [1 ^
  59.     token = strtok(NULL, delim);
    " d  S' m& ^& ^8 [7 ]  O
  60.   }
    ) d0 R! C0 T5 v! R/ x- S
  61.   5 A9 }& o$ }3 e3 M7 ?
  62.   if (xi_n != yi_n)
      J$ A2 ?& L1 v& O) I
  63.   {
      e5 u$ z! f, O# a; D5 j( e- c
  64.     return 0;$ @2 h2 e+ g# f
  65.   }
    / d( C; c+ Z' L" B: ~/ l
  66. : W4 j; V0 N' I, |
  67.   m_n = xi_n = yi_n;
    2 N7 k5 N$ Y1 V# h% B0 P2 x

  68. ; l: X# C/ |7 m
  69.   return 1;
    ; V9 @7 }" a$ m! C
  70. }) f2 f( R* G/ @$ b# ~6 q) b+ |. \

  71. 0 }# V( ]. `( J2 Q4 b  ^
  72. static float
    9 C4 Y7 b- n  Z+ @: T
  73. m_lagrange_interpolating() ) e; h7 A) O$ _7 i. Y; U
  74. {
    : u/ V$ b) S' N$ Q' C7 X: B* O
  75.   float l = 0.00000;0 \+ `6 V  F- ]8 w+ v* {
  76.   float li;
    $ e' k1 l6 i, `$ A/ A% N) Q
  77.   int i;
    / k$ d/ e# N' f0 m. k8 T
  78.   int j;: y7 t* l# V& V
  79. . P( H# Z0 ?4 w. X
  80. #if DEBUG
    4 F; H& p: o* v
  81.   printf("DEBUG at %d: enable debug mode\n", __LINE__);
    - T3 B: ^# T% R$ A5 n% c$ a6 p
  82.   unsigned int m_n = 3;
    ! l% u3 f2 \$ L3 ^# x
  83.   float m_p = 0.5635;
    - c# T/ W) E# C& W: c* _
  84.   float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
    4 l$ ^) S$ @7 Z# ^1 m3 z4 b/ m
  85.   float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};% {, u$ ]! P; I. v# t; c6 r% [
  86.   $ F1 c) C) g2 x% X
  87.   for (i = 0; i < m_n; i++)
    + n9 p$ u% G3 X& c
  88.   {
      Y- i- `8 A/ ]3 \$ x3 ]
  89.     li = 1.0000000;
    + f: `7 k3 m& j6 M" M( R- s9 l9 }4 h
  90.     for (j = 0; j < m_n; j++)9 m6 C1 P7 ]2 _
  91.     {6 C. e5 t; k3 {1 {% b7 U% J
  92.       if (j != i); s/ X3 a6 y8 ?1 ?  ^& v7 j. ~7 K
  93.       {! s! [* I, Z. `( {( `
  94.         li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);5 D0 z) y7 w) v2 p9 ?
  95.       }% G3 n( g/ Y: m$ U# q* D5 ?9 n
  96.     }
    ! A* H% G! m1 Z. t3 j1 \/ I
  97.     l = l + li * m_y[i];
    % V  F' m: e1 n
  98.   }
    0 h& c- K- g$ I
  99. #else# `8 }* y) x7 O$ x; k
  100.   if (!m_lagrange_interpolating_set_n_arr())
    & x! @. O( {: V4 U* f. f
  101.   {
    1 }) s/ `8 l2 ^! L; d7 X5 D1 V
  102.     printf("Error: xi and yi counter is diff\n");, H1 f8 j# S* a+ E. p+ @. T
  103.     , D9 p' q& E! J" c* j
  104.     return 0;
      m5 C7 J, j& l/ v' n
  105.   }
    - k8 L2 w# F5 a2 g

  106. ) L( m8 R5 q3 s: c  ]: T
  107.   for (i = 0; i < m_n; i++) 7 L7 X! T0 b: Y+ j- f& U" \
  108.   {4 n5 i/ N3 C3 n- [$ H" e: V. ?+ o
  109.     li = 1.0000000;
    3 G, i, Y- z% v( R( O
  110.     for (j = 0; j < m_n; j++)
    " r# z1 N6 ^, K, w) Y. R0 P6 s& Q
  111.     {: ^: W* ?: h' `) e! l1 [& a
  112.       if (j != i)
    : V. q5 G: R, ]$ P0 h( T& u
  113.       {
    ; c& K  A) B. ]$ `
  114.         li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);7 J) t3 b/ C% c$ C% f& }3 p% _- W: ~
  115.       }! _4 }  D6 T1 k3 P
  116.     }9 e! @' c$ H' E) a5 ]
  117.     l = l + li * m_arr[i + m_n + 1];
    . Q, \. O" c# \9 }) t- s
  118.   }
    6 o4 v% @4 ~' M, w
  119. #endif& J3 X2 C, @; v+ k" O. e) M
  120.   ^. }, Y3 K  i) S
  121.   return l;
    5 ?" h6 l: I& g, M5 V
  122. }
    : g7 z/ P) l1 I; Z5 R) e% W% y
  123. - X2 E& Q$ S  M) Z% P
  124. int 9 w+ z+ P, @: y/ f1 p4 w
  125. main(int argc, char **argv)
    2 A( Z8 S2 w) C: Q6 D
  126. {; L! Z0 ~6 o1 h4 C
  127.   int c;% m" H- {' i1 B! a9 _5 {# [  u
  128.   extern char *optarg;
    4 l& p% w" X( {( ]
  129.   float res;
    # a8 O* e; a# l" T# ?' T; P! T: q

  130. ' L/ F: [7 @+ Y2 _
  131.   if (argc < 2)
    / n0 q3 _) E0 ?% O
  132.   {
    + n, F5 q0 O5 h/ g  o7 `$ v* Q9 Q7 A
  133.     m_lagrange_interpolating_usage();
    & B" l* F( w/ s+ `
  134.    
    + s# x2 p% e" ~& @* o
  135.     return -1;
    5 e& s, C' M, t" ^
  136.   }
    ; C  n3 L! T3 P( M2 w

  137. 8 Z8 f& E9 w1 m+ p0 O# O
  138.   while ((c = getopt(argc, argv, "p:x:y:")) != -1) ( s! V, W& a, y9 c3 a
  139.   {
    * ~8 V" X" m0 W2 T8 M
  140.     switch (c)
    ' @( u- [# Q9 O1 ?. o
  141.     {
    $ f9 d+ c- m# x2 B
  142.       case 'p':  a% E; ?% b7 j$ g
  143.               m_p = (float) atof(optarg);% T, R* F1 K0 m/ ~; j% Z
  144.       case 'x':
    4 P. P9 R5 ]4 T, e1 F0 X: L
  145.         m_xi = optarg;4 E  t% f5 C1 b8 K! Y
  146.         break;7 j( r  k  k0 S
  147.       case 'y':9 ^, w+ V  l# b) f9 }6 `4 F
  148.         m_yi = optarg;, a2 q- c7 |; R' c4 {6 ?2 T; F9 F
  149.         break;7 ?$ w* S4 @3 J
  150.     }
    0 _" e* B/ E! ^
  151.   }+ N6 R2 G4 @! }( _% w( M% X
  152. ! p/ C" l9 z0 [8 l. \  L6 D  O, E
  153.   res = m_lagrange_interpolating();( V( h- }0 S  ~0 [0 |* g
  154.   printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);1 T2 {8 [! W+ G9 G
  155.   
    ; B! S) [  w& R) V& W8 u! T
  156.   return 0;, L8 l7 ~1 @  J7 ]8 t
  157. }
    , ~. V' A8 |% `" X* p+ u
复制代码

作者: 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
楼主辛苦了,继续加油哈!
. Y# g/ D7 R# |: [% h0 a
作者: 1617463814    时间: 2020-4-7 18:30
谢谢分享,先下载来康康~
, [3 k8 y, x; {( N3 H




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