数学建模社区-数学中国

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

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

软件名称:EXCEL自定义插值函数插值计算数值计算+ R- B8 l( v; q2 q) W7 h 版本号: 04y09m28; i+ s, w/ d; `; j 分类: 工程设计应用 6 _2 a. n- i" |) K7 _) S性质: 免费软件 - i8 O: n b1 x( a! O使用说明:

$ ]8 z% \8 D9 [: E: `, K

人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点: ( b Y# [4 J% n5 D 9 M/ Z; I/ c: l2 c 1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。

5 l; z% B2 ?0 _: F2 M2 ]

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

; q5 P' K4 e8 H; G

EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。1 ]8 E/ C; J9 _0 \4 \8 O 9 m9 ^9 S% `6 Z 为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。7 {* g% I7 `! `7 O/ c+ S U! {0 S 单曲线lagrange插值函数:double twlq(double x,char* filename); # Q2 B$ |2 ?: S+ Y$ ?" j' u double twlx(double q,char* filename);2 X$ ^- b& h r 曲线组lagrange插值函数:: h' X0 J" o; ]0 M- `# _ double thlq(double x,double y,char* filename);- ?8 o7 S9 J" g0 J double thlx(double y,double q,char* filename); 7 p, A7 P' Z5 P2 n" z& L double thly(double x,double q,char* filename);。

# X, W; s+ x% i0 g9 z5 z" e( U

例:单曲线插值函数 "带路径的保存数据的文件"结构如下: ' B- ^& Y! Y4 f' V@ Description @ 1 t8 g% j( ]' H( B1 {$ u- @- Z n, nsel; $ w0 K f% S/ nx[0],x[1], x[2],··, x[n-2],x[n-1]; 3 S3 B4 F, t8 ` U; Y3 h1 Kq[0],q[1], q[2],··, q[n-2],q[n-1]; 9 ]7 a/ V$ ?% A/ @$ k+ E4 EMinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA

$ s; A+ A; ?$ ^; F: q) M" f

注解: % t5 c8 C& v9 u I! j Description:用户自定义描述字符串(Description中不可有@符号); : }1 p8 e( {1 h& p n: 总插值点个数;! @" Q. n/ A# c2 ^ nsel:实际参与插值计算的插值点个数; + s, J8 d7 B- E6 @1 { MinX=0.7,MaxX=0.9 取值范围; ! b+ M" M3 U( S( k& m, Q OverRangeAlm=1 越限报警 1:报, 0:不报; # L9 K+ n6 j2 i+ s( S* | X=电压,XUnit=mv,变量名称,单位。

3 n; M" m3 T2 E" Z" Z! s& A

****结论: - F, Q+ e: y2 H" } l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。8 q$ ]: R) g6 r8 I. `5 H 2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。+ c' C6 C$ c1 q, z) u% k8 `1 A 3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。 7 C+ O# U6 N! h* W 4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。

5 W9 n# @0 M& Q. ^, Q# P

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

: u. Y5 Z" o% v5 N [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. / M! W/ X" u6 X  @4 y
  2. /* TODO: Lagrange interpolating
    2 M9 m# B& a3 ^8 @+ j
  3. *
    $ a- W4 Q% b: h
  4. * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?
    ' E' ?& q: n' S* V; s) ?- b: }* A
  5. * In this situation, it could be solved via lagrange interpolating
    8 l3 ?& ~. J* j% L
  6. *
    & A) ]( E2 n* c) |/ ^: U
  7. * */  _4 ~' @6 I4 c7 v1 W8 R( N2 d

  8. ; R) o8 \- [. Z. d7 L- V( M% u4 a0 g; y8 g
  9. #include <stdio.h>2 C7 L1 Q6 {" i% s( ~  G, }. w
  10. #include <stdlib.h>5 f6 Q2 A) x* k/ U9 s% `
  11. #include <string.h>
    : J+ V: r  Q* P7 _

  12. 1 c$ c% u1 \3 I# p9 x6 {% A. l
  13. #define DEBUG 0
    3 [3 Q9 ?" K+ \9 t- f7 k" g

  14. 9 U, }7 O$ t* n- F$ E1 ^# H
  15. static float m_p = 0.5635;" j' \( w; h% N$ U
  16. static char *m_xi = NULL;/ `/ ^9 s! c$ P/ R' d
  17. static char *m_yi = NULL;. K/ ?& K5 H- F& H
  18. static float m_arr[] = {};: |% F6 W, f! O6 ^; O" |- E) A
  19. static unsigned int m_n = 0;
    ! V- {# C  }: L0 q+ j4 u
  20. 0 f! t; J5 F* g0 Z
  21. static void m_lagrange_interpolating_usage();& F2 p3 l) |) `$ S- o
  22. static int m_lagrange_interpolating_set_n_arr();
    6 a9 _3 y5 ]0 Z) J4 _0 r" n
  23. static float m_lagrange_interpolating();# \$ g, k) l8 I% E! ]

  24. ( L, @# n) T" |, o! N, G6 ?
  25. static void 6 E( E! S4 v3 _+ t) {* K  d
  26. m_lagrange_interpolating_usage()
    * }3 p9 P3 t0 L2 u
  27. {
    ! _1 @& B! j$ j$ x# H' b
  28.   printf("Lagrange Interpolating Usage:\n");$ L* f& @+ w( P5 M- u6 ~
  29.   printf("bin/li -p ** -x ** -y **\n");
    ! B1 r  {9 O( \
  30.   printf("-p 0.5635\n");
    . z8 {# ^4 k" [
  31.   printf("-x 0.56160,0.56280,0.56401,0.56521\n");7 ], ~& O# v- x3 v8 s( F+ ^" `
  32.   printf("-y 0.82741,0.82659,0.82577,0.82495\n");
    ' O* o: C8 `+ T1 G
  33. }6 a9 M4 l) a3 G" u( Z

  34. ! a4 L* [8 e2 [
  35. static int ( a4 N7 }2 }# _% V6 z
  36. m_lagrange_interpolating_set_n_arr() / R6 t: Q0 \% w
  37. {
    6 H9 m9 ]9 y5 `# j* W
  38.   int xi_n = 0;
    4 B% a$ j) i/ |" v3 q' F% A
  39.   int yi_n = 0;1 H+ X; p* W+ u4 n2 i8 e
  40.   int n = 0;
    + t7 z/ M! L6 o0 H6 ]  i
  41.   char *token = NULL;
    # H5 K# V  \; Z# R7 Z& z& b
  42.   const char *delim = ",";
    & f- K$ G5 ^) m9 a2 c: U4 u: n
  43. 7 ?5 B6 O$ [. T& m7 O1 ~1 X  U
  44.   token = strtok(m_xi, delim);
    ! F& ?9 ?6 y" b& o# x
  45.   while (token)
    * y" g, |7 L, T& F$ ~, G6 v
  46.   {
    ( E" T, g" e& e( I; G
  47.     xi_n++;
    $ F( o" e# r! U6 K
  48.     n++;
    * y6 g+ {! a$ i( c
  49.     m_arr[n] = (float) atof(token);
    9 V: k% r6 c5 j# \/ \% t
  50.     token = strtok(NULL, delim);1 N( ?  w) k5 h: d+ x% h' R
  51.   }
      K- p4 u2 `/ M' q" v' R: C2 G

  52. , ?  D' X, L+ Q1 G) G% _3 n" v+ D
  53.   token = strtok(m_yi, delim);, _/ |$ Q  N. j
  54.   while (token)1 ~$ W: T, Q4 G, c) x. j
  55.   {% e1 l9 D% _" b6 i% \
  56.     yi_n++;4 J: f9 @5 Y3 _; t& n
  57.     n++;- l0 ^" R; x$ T) b; M
  58.     m_arr[n] = (float) atof(token);: O2 g! r5 ~4 a# v$ A& R9 A
  59.     token = strtok(NULL, delim);
    # O  {8 N* j% L, D8 j) E
  60.   }% f) z* F: q$ n& U: l. ]: b; _
  61.   
    5 w! ]$ }5 m; P% e. y
  62.   if (xi_n != yi_n) ( e5 T  D; N9 O0 T& I  O: G7 |- |
  63.   {1 P, M# A, t% s1 [6 ]9 Z; W8 h! a
  64.     return 0;
    * o% ]) y4 L2 T, c9 n
  65.   }5 l' f$ s  L, L9 N5 _& V! l4 n
  66.   k* `+ n; [4 B4 a
  67.   m_n = xi_n = yi_n;3 [3 N5 I7 O4 i6 J5 t1 Q

  68. ; s( e, |6 O, {" U* F1 e! ^5 g
  69.   return 1;
    # u5 ^; O6 a% c! ^! Y
  70. }
    ! y; x1 A! j1 q! B+ Y4 b
  71. ) D9 o8 D1 `0 E  h2 L
  72. static float
    1 J8 t$ r' u, U
  73. m_lagrange_interpolating() ( d8 e& u/ B: T$ P! j- g
  74. {$ D& L" C) `+ W  E( I
  75.   float l = 0.00000;
    ' |* q, _: H8 c$ h" J' d; ^! `
  76.   float li;( n5 n. M/ a4 q1 {
  77.   int i;: p: [, N/ U+ ^/ ^5 r' @4 k
  78.   int j;8 m, |3 T6 q9 J) b1 v. a' Y
  79. , d( {0 L! L5 ^( N7 D/ S; ^7 }' T
  80. #if DEBUG
    2 C- b# O8 z% F* e) I1 D
  81.   printf("DEBUG at %d: enable debug mode\n", __LINE__);# D% k8 B0 b/ k. @. e& T7 K
  82.   unsigned int m_n = 3;
    0 K: _4 j! D: \
  83.   float m_p = 0.5635;
    ; R8 |6 ]9 E( y3 a% L& U3 U
  84.   float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
    + a& n! ?+ R! i
  85.   float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};
    & Q$ L; h3 T1 M  i0 t/ H4 \
  86.   
    ! L* S+ g/ {) `! @: @+ ]
  87.   for (i = 0; i < m_n; i++)6 U- D+ k) ?- ~* q
  88.   {3 i$ }& P' y' A9 T5 Z, \
  89.     li = 1.0000000;/ {6 n4 f6 Q+ a" u, v2 f
  90.     for (j = 0; j < m_n; j++)
    3 f9 C! r/ d+ O3 k' T1 k
  91.     {7 l+ L$ {' p8 [2 A) W5 Z
  92.       if (j != i). n  Q/ B% S! u0 t
  93.       {
    $ |  U6 t, c! v% i: ]
  94.         li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);
    5 b/ O7 j- J7 b( [. T# V: X
  95.       }
    , M% @' b/ s7 {7 L: I
  96.     }
    ! V! m2 v6 N7 Y- q; h, ]
  97.     l = l + li * m_y[i];
    1 v" ~  O/ `0 r2 f+ t; V7 S
  98.   }+ P2 q; z  q9 O* {1 d. C
  99. #else; ], v! N0 K2 q- L
  100.   if (!m_lagrange_interpolating_set_n_arr()) 8 Q/ k3 D( a  H! x/ |
  101.   {) _2 w7 @3 N$ C, v; J. c
  102.     printf("Error: xi and yi counter is diff\n");
    $ W+ E5 Q* H6 E  A
  103.     - m- M/ j- w9 O4 q! [6 _7 b- \0 _
  104.     return 0;
    & ?: V6 b8 H7 ?4 U
  105.   }. a3 m, `- _& Y9 S6 G7 {7 d+ x; r
  106. 9 A& a5 w& e. X/ w8 S/ A
  107.   for (i = 0; i < m_n; i++) & \0 D$ m( l) O) d) R3 H4 z
  108.   {2 ~9 c% {7 D! m7 G: b
  109.     li = 1.0000000;
    $ u& H% F7 X/ {% I1 T- z$ p- S
  110.     for (j = 0; j < m_n; j++)
    2 b& K- k) R: V) ^/ G# k1 J7 x. h
  111.     {' F! B7 _5 r' o# y! n2 ?8 H
  112.       if (j != i) ( m2 d2 T$ X' [& t( i) s( w8 [
  113.       {9 j+ U9 l! ^: \2 D0 K/ H+ B
  114.         li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);) C1 s" Q0 l: B& j% D$ Y- c# I
  115.       }6 i* a9 k$ s- J# S0 O0 l5 z* N" u1 l
  116.     }0 \' M: i1 e) n/ N- h; T
  117.     l = l + li * m_arr[i + m_n + 1];
    7 d. a/ a% T0 h, h! s3 n
  118.   }
    8 \% o5 u9 J6 G: T- q" t  H( A
  119. #endif
    ! e: y, t; P* b% B" [( Z' E/ N. m
  120. 4 p* B/ B9 R# L; F0 Y: g( Y
  121.   return l;& {4 V# W6 C: _& D9 U0 y
  122. }; b7 q' d( J8 H" N. M

  123. + ~* H1 \3 r5 `$ U+ ^
  124. int 4 \2 U% f7 f; W7 T! @: i
  125. main(int argc, char **argv)
    - g( [3 J) ]) b, w$ c" _
  126. {
    & i  w( N# u/ H% F
  127.   int c;$ y" e$ _9 ~+ ~3 Z2 z) f; Y
  128.   extern char *optarg;5 J$ a8 M9 e- J. t+ f8 U0 j
  129.   float res;
    3 P" H7 F  F1 S, G$ ?

  130. & o6 w) x& u5 G4 O3 {
  131.   if (argc < 2)
    ) b2 F  K  ?( P, O( c; y* e+ e" g
  132.   {+ Z* W8 p  B& [" q9 I; c4 h
  133.     m_lagrange_interpolating_usage();
    - y) i1 x" I# Y* E
  134.     ) D- m1 d+ c) \) E
  135.     return -1;
    , a& f! R( L3 _6 D  t
  136.   }& t3 L- x% x* o' ~  W2 N7 d

  137. : A/ A) P2 E4 V" u4 |: m$ j- h$ M9 Y5 ?# f
  138.   while ((c = getopt(argc, argv, "p:x:y:")) != -1)
    / O- x: I* w& K
  139.   {
    , G6 Y/ V% z! Q9 Z
  140.     switch (c) ' U$ M* F) a, D$ c9 k" b
  141.     {' a& l0 w& d* n) r! g6 I7 j4 V
  142.       case 'p':
    : e  _1 C. z; O: d" C* I$ i4 c
  143.               m_p = (float) atof(optarg);
    3 V4 `4 Y: |; c4 P, S& H- G
  144.       case 'x':; n, M5 r7 e4 I; e9 G9 m+ V
  145.         m_xi = optarg;5 _1 K' |/ f( n/ E; @4 R
  146.         break;# a! Q' y2 W( m! Z) r5 V
  147.       case 'y':
    2 |8 ?( ]- v! q1 c0 a
  148.         m_yi = optarg;6 z+ |- h& L4 C$ z
  149.         break;
    , q. \5 x" `3 c9 G% `% |, C
  150.     }
    5 P7 ^4 a2 ^; P+ k
  151.   }% l0 R2 S4 m! X0 l$ ?
  152. # M3 P9 p6 B  I- U& x
  153.   res = m_lagrange_interpolating();
    7 f" G1 B' n& B9 f5 v( x
  154.   printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);1 _! y3 e5 u6 S* g+ r
  155.   8 X& s! m0 p- U# G
  156.   return 0;
    3 v/ C" w2 z6 Q" m/ b
  157. }5 W( |# f  @" g: T8 p
复制代码

作者: 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
楼主辛苦了,继续加油哈!3 h6 b+ k1 I& X% m. n" M5 u

作者: 1617463814    时间: 2020-4-7 18:30
谢谢分享,先下载来康康~
1 w# V: l# O) l0 ^




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