数学建模社区-数学中国

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

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

软件名称:EXCEL自定义插值函数插值计算数值计算 - g+ h" I8 m9 C# @# r( }9 g* H! x; E版本号: 04y09m28 6 W! I6 @3 |) w2 I/ C7 \0 o分类: 工程设计应用: q I3 v2 o% g3 @# b# v: s6 F 性质: 免费软件 / v( }$ L) ?- K5 r# P9 h6 |2 Q使用说明:

" N* S0 c/ T8 r3 u

人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点: ! F- [6 G" F* Q , c4 s" h' q- t9 n6 O: I6 n+ j 1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。

% i9 o1 ~3 X; w% J) b

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

8 k8 E Y$ b7 y+ N" E) A6 ?1 Y

EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。 ; {. C$ i4 |: k# @$ w+ {( a) s $ j, M+ x0 ~& P$ r# r% V 为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。 0 z, }, s) D2 q9 n. d1 g单曲线lagrange插值函数:double twlq(double x,char* filename);+ M1 y% V3 |( C# F double twlx(double q,char* filename); 5 f( S9 {5 K% @8 ]/ I3 d! P m曲线组lagrange插值函数:& L# Y9 O3 J+ H9 W5 o8 l double thlq(double x,double y,char* filename);1 {: w. E/ M0 g+ H double thlx(double y,double q,char* filename);; {. b8 G7 M- D; M' D: c double thly(double x,double q,char* filename);。

) O* J- }, l$ L4 i: K* j. {

例:单曲线插值函数 "带路径的保存数据的文件"结构如下:& E; d" ~, o1 F1 x+ [% i @ Description @" V. z: F8 m5 h n, nsel;6 J8 X& J& ?- q, H+ ~7 w x[0],x[1], x[2],··, x[n-2],x[n-1]; 6 K/ j6 M$ Y5 G+ B/ lq[0],q[1], q[2],··, q[n-2],q[n-1];- Z* X6 V( I8 o m$ z: ~0 R MinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA

9 C) m2 D8 s. E$ [7 m" V' }

注解: : ^ a9 ]3 O. W* h* `# \9 i Description:用户自定义描述字符串(Description中不可有@符号); # o/ A' C& U" m. m# s% ]8 O n: 总插值点个数;6 K- L" a+ l1 N( u. [ nsel:实际参与插值计算的插值点个数; ; y/ I% l5 f/ Q MinX=0.7,MaxX=0.9 取值范围; 0 J& d' k1 [# }3 B OverRangeAlm=1 越限报警 1:报, 0:不报; " N" t! F, Y @ t X=电压,XUnit=mv,变量名称,单位。

, P8 |0 J5 n# E3 N4 S

****结论: : |0 m, l* O0 K/ A9 Z, O. U l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。 ' j" V, U' b" u8 m( m 2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。 # S7 G. G" {( s! S; V! h 3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。 7 O! ^+ Z6 {+ W9 n8 \ 4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。

- a' m, J, o1 i0 ]6 S5 ^% ]

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

% k: L/ V% v* |2 w# B V [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. ! N. W& [( z, ~) F* `. c  a
  2. /* TODO: Lagrange interpolating
    % r  [' W  a7 F% _7 x! X
  3. *) W/ w3 _3 x, p& ~& [& B
  4. * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?
    / I1 |$ ?8 X9 d: K; l2 ^
  5. * In this situation, it could be solved via lagrange interpolating) `/ a/ x, ?8 P5 [- y
  6. *
    . [1 A8 r) G- g
  7. * */; F: n2 E) L& ?& i2 T( n

  8. - ^8 G! l& Y3 N5 a
  9. #include <stdio.h>
    & o; x( N1 _& g
  10. #include <stdlib.h>
    3 T9 m% k7 G: T" B
  11. #include <string.h>
    9 c) U# {8 b! ?0 o
  12. - P- F0 ^; |, S. V( j2 s2 I
  13. #define DEBUG 06 [4 D. L$ _, y5 C7 t

  14. 1 b! S& Q5 ^5 S0 q
  15. static float m_p = 0.5635;
    % ~6 H9 ~) s5 a& \: o9 t6 j6 H7 p
  16. static char *m_xi = NULL;
      U  j( o  i7 @6 e( U) I8 a% k
  17. static char *m_yi = NULL;
    / i/ O& J* ?8 L# k% e. d  c
  18. static float m_arr[] = {};
    ' k& W7 n5 W6 G6 ?4 U" ]7 D
  19. static unsigned int m_n = 0;* ~( \5 @. V9 F5 T0 [

  20. 3 ^" g- z, V) ?5 y  s4 G
  21. static void m_lagrange_interpolating_usage();' X: F% @2 q. x; |
  22. static int m_lagrange_interpolating_set_n_arr();
    $ [) r( J' y9 k& f% \% y
  23. static float m_lagrange_interpolating();
    3 H, t' z: h, E. w* _

  24. 6 ^$ m" K$ h7 o7 v& f
  25. static void 8 G; \, D( D: U, U( P# \, d
  26. m_lagrange_interpolating_usage()
    . c* l  C# W: _; Q% _3 c+ T
  27. {& ^$ e" R7 d5 M7 F1 e) n
  28.   printf("Lagrange Interpolating Usage:\n");
    2 |% d+ c" D; c/ ?
  29.   printf("bin/li -p ** -x ** -y **\n");* K# ^5 d. N/ t
  30.   printf("-p 0.5635\n");
    $ `$ S6 E$ H0 I& u
  31.   printf("-x 0.56160,0.56280,0.56401,0.56521\n");
    * H; v7 Z, O5 `7 w3 i* I5 u% o9 |, S
  32.   printf("-y 0.82741,0.82659,0.82577,0.82495\n");, L. h& t# ^- O, ?
  33. }& T6 f; f$ C- U4 m! W$ M
  34. # O, [- h% E. U1 L$ P
  35. static int
    $ U- [5 Z8 O% L
  36. m_lagrange_interpolating_set_n_arr() # W- j; \+ p/ s3 T2 J6 d
  37. {. c3 q3 ?; A- B  h7 y0 Z- [
  38.   int xi_n = 0;, W6 {( y1 G' U# q7 @( Q0 A, G
  39.   int yi_n = 0;
    $ E0 r. A8 r5 k# T# _. {
  40.   int n = 0;
    0 G. T. E2 ~9 R* P  S0 X  ^- v  ^) V
  41.   char *token = NULL;7 Z, k  k. t8 S9 {  D3 k: w* u
  42.   const char *delim = ",";; `/ K( O$ j0 B1 |5 @/ G9 |$ n: {% M
  43. ' _3 z" R% q1 U, C& |6 J- v
  44.   token = strtok(m_xi, delim);
    ) \: I1 P5 @% Z( k: g
  45.   while (token)
    / f, i% S9 u+ E) {- J5 Q
  46.   {
    : g& G) a' h$ \! Z$ F
  47.     xi_n++;% [. I: N! D% {; Q$ i% u) s
  48.     n++;
    % {5 A/ r  t0 G1 T2 r% [7 ?
  49.     m_arr[n] = (float) atof(token);! @/ F" K2 }0 Q# }( X# o. L+ v
  50.     token = strtok(NULL, delim);
    ; `- [6 m2 `; w" v! i6 Q6 |% N* a
  51.   }
    ' L% d; B& w8 O1 i* M
  52. : C% k6 ^5 v1 A/ r4 [2 w
  53.   token = strtok(m_yi, delim);  V' o5 V' ?6 W& r
  54.   while (token)1 R( `( u3 I# C0 i, i3 M3 w  k1 K/ @
  55.   {: i3 F+ ^8 u4 c! f& {: }) `0 D, J
  56.     yi_n++;! V# q1 |* V9 a0 t
  57.     n++;
    5 t3 h2 x/ i+ H4 `# _; o
  58.     m_arr[n] = (float) atof(token);
    8 k; |! r) _6 h# d7 q0 q7 Q
  59.     token = strtok(NULL, delim);0 t! ~8 f6 w+ D5 t8 d- t: J9 m
  60.   }
    9 k  \2 s4 L; _: M
  61.   4 _& v( d5 P8 N" K) J
  62.   if (xi_n != yi_n) 2 x. M# A2 a6 u' s/ {  t0 H
  63.   {: u* x% W! d9 O0 ]8 _5 U% x
  64.     return 0;
    ( B+ p0 Y1 M7 u* a
  65.   }6 L" Z! }) F; C$ u

  66. 4 p: L- }- |2 t* f; `2 y$ E
  67.   m_n = xi_n = yi_n;
    3 b, d& c5 M1 b! s8 h
  68. 9 r) m% x* l' ~. |
  69.   return 1;
    9 `9 E7 B% `) a: M: e3 N$ Z; z! c* O/ _
  70. }1 W/ _8 Q; u( p1 V
  71. 3 ^4 t; C" T$ m/ _+ b+ T
  72. static float & y& F0 B( P$ B% \: n) [+ `
  73. m_lagrange_interpolating()
    , Y6 e! L& `$ J4 |
  74. {
    5 {) G- v8 G, ~4 D/ N
  75.   float l = 0.00000;
    5 t# a: @5 h3 F1 b+ L) e
  76.   float li;8 E1 @% V  q# ]3 G% f4 G
  77.   int i;9 u3 W) E/ N- Y  p
  78.   int j;
    + f* s" l% B; H" T: a$ C

  79. $ J) d% N( o6 i8 ~. p- p! x
  80. #if DEBUG
      V/ _6 m% o, K3 c
  81.   printf("DEBUG at %d: enable debug mode\n", __LINE__);
    " I) l4 m) s/ g7 \  Q/ q
  82.   unsigned int m_n = 3;
    % |# r2 I( x  y2 N& M2 |
  83.   float m_p = 0.5635;( Q! [1 r5 U  M( |
  84.   float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
    3 i  o3 o* T$ Q& H/ o- I* I( L
  85.   float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};1 Q4 J8 s8 w" l; j1 L) p  X9 ]
  86.   
    . s, A1 S" x9 o* g1 e
  87.   for (i = 0; i < m_n; i++)
    4 z% Z7 a9 j2 Y( G' z1 O8 y% T
  88.   {
    ( q- E$ m2 @* Z  H; c- S
  89.     li = 1.0000000;2 t) `& \* n- Y$ e
  90.     for (j = 0; j < m_n; j++)
    8 x, o  _. |% J; L/ E" n
  91.     {' G7 s7 [6 ]8 g6 {4 M7 ?" L
  92.       if (j != i). o: [# q6 q6 G% Q! J1 b
  93.       {
    ! q" ]0 R$ z* B4 S" S* o
  94.         li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);6 m. \5 P% K. D0 z' \
  95.       }" S$ C, c7 V/ B/ `! }
  96.     }  ~) }8 i- h+ [+ l# J% M. R
  97.     l = l + li * m_y[i];5 C5 W/ g) B( e: E
  98.   }/ t# m4 e# q1 I- ]; Q/ I
  99. #else
    % M* k9 A: s# v6 W2 @+ ?/ M
  100.   if (!m_lagrange_interpolating_set_n_arr()) 8 H& @) R7 r7 @" |
  101.   {
    : d( c# z" w6 h: n0 k
  102.     printf("Error: xi and yi counter is diff\n");
    8 j3 _  V: o. k& k. [: p
  103.     & s6 H! H3 [) w4 Z# A
  104.     return 0;
    $ E" V- {/ Q! z; {0 B1 H& N
  105.   }/ D. m1 P  A' x; O. d) k
  106. % ^9 g& i; @' `7 N5 W5 m4 h+ C
  107.   for (i = 0; i < m_n; i++) 9 ~( j  Z0 t/ e0 \- }/ D
  108.   {
    ' V, ]% }7 u0 |# E+ s$ c7 a& E
  109.     li = 1.0000000;
    , Y8 {. a: F( S$ S" @. M) e5 B# X: z
  110.     for (j = 0; j < m_n; j++) 1 \7 W9 E4 n+ e5 n+ m# e9 Q
  111.     {
    ) Q5 k# Z3 E. e% c/ @( u- c
  112.       if (j != i)
    % T% t( ~* H9 v- s
  113.       {# d" o. l) S9 ~+ u  {' R, N
  114.         li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);
    8 V" w7 S7 C9 |# b' u+ X+ {1 P. y. F
  115.       }
    . k% D& ~  b+ F+ H9 S, C! n
  116.     }$ H& g+ r: b* R& n' k8 C
  117.     l = l + li * m_arr[i + m_n + 1];
    + V5 Z& k7 |$ e5 X& }
  118.   }6 c+ S4 U9 h$ U4 D5 H  M. M# T
  119. #endif
    ) _( m9 L3 X) R$ f+ v; D
  120. 6 L: u  f  A4 [7 E/ h2 {) p" D
  121.   return l;& A2 L- p+ j( n. s7 O/ u6 `& \9 I
  122. }
    ) y, _$ D. h& x: O; X0 {
  123. 7 k( k- ]/ P8 F2 ~, C
  124. int
    " B# H& `) @  R; B8 Q3 h% g+ {' c+ T
  125. main(int argc, char **argv)
    . `7 M; I; O( o2 E. K0 r
  126. {3 J: `. F( ]/ v7 D5 r6 c+ i+ G! o- f
  127.   int c;
    0 E" [' H5 [$ x* {6 B7 |
  128.   extern char *optarg;: |- T" n1 j- w2 s& e$ y
  129.   float res;1 \/ w$ d3 g7 v) ^; [

  130. , b/ l5 }2 ]6 ?' T
  131.   if (argc < 2)
    + p4 H% U5 J- x* U7 w+ f
  132.   {% ?% |! p9 N8 W& {( e, ]9 E+ Q
  133.     m_lagrange_interpolating_usage();" ?, ~9 p. l/ `0 w* p! ^& V
  134.     7 S3 D4 m: Q+ d3 e8 d  N' D
  135.     return -1;( A/ ~6 \0 o8 P3 P* p3 l. W. Y6 t
  136.   }8 f) l( Z- d6 i7 I4 y2 q. p

  137. 9 O- E5 d7 w  s6 c' {8 D
  138.   while ((c = getopt(argc, argv, "p:x:y:")) != -1)
    : O) j, C( T' v$ {
  139.   {
    : K1 q9 _  H: G- W6 M; T
  140.     switch (c)
    $ |! p+ X3 w) `! r
  141.     {2 z! S6 C6 ~& @$ H5 k" E/ W) C# B& N
  142.       case 'p':: U" V+ P) ^/ O' a
  143.               m_p = (float) atof(optarg);
    / M8 G; p. T* w8 ^% C+ p" K! D
  144.       case 'x':* ]" Z+ ^5 a0 g* }' h+ [& W
  145.         m_xi = optarg;3 T! B3 A. ^7 L9 d. {+ |: t. C2 v8 o# }
  146.         break;
    4 l, X7 L) i2 ~9 I* C1 _
  147.       case 'y':( b" w& R2 w9 }; [9 J5 }5 |
  148.         m_yi = optarg;
    . v# I% v/ H9 Z0 V+ s9 ~. B
  149.         break;
    . X* D" e% V- x: ]( ^, i, I1 C
  150.     }8 t$ F) V0 s$ [+ L, F+ ]) E
  151.   }' k4 {' c+ u, N. e

  152. 1 m$ f) B1 D4 j& R
  153.   res = m_lagrange_interpolating();
    : }7 T. q% Y5 y
  154.   printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);) I# i/ Q' Q' R' z9 n
  155.   ; Y, D. Y) @1 `+ D
  156.   return 0;
    * m8 `1 n& z1 M
  157. }
    ) I6 v5 g7 o7 R9 ]; 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
楼主辛苦了,继续加油哈!
6 k5 G( T0 U$ ]& q- h8 i5 X6 z
作者: 1617463814    时间: 2020-4-7 18:30
谢谢分享,先下载来康康~
) I$ e  `8 F: n7 {1 ~- _% O, n7 m




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