数学建模社区-数学中国

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

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

软件名称:EXCEL自定义插值函数插值计算数值计算 - C. w) P9 C3 N6 T; N* U2 h) D: F版本号: 04y09m28 " S0 n, O. U3 }/ }分类: 工程设计应用3 k8 O9 ^2 u' D3 `. F/ o. O. \4 I 性质: 免费软件/ ]9 }/ K. [3 y8 V* D7 O 使用说明:

7 j* j$ k; l2 p* R7 |7 C

人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点: 8 ]/ f/ F- `& A # p$ u# K, U3 v1 N 1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。

9 s2 b* h( U7 ]" n

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

5 H9 `7 M' J' l0 f6 b& [7 O

EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。 5 \: c5 {0 f8 T8 E: C 6 k) [& k2 x8 C/ f/ W 为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。 . ?' `- Q1 {* u9 K3 H$ R( R单曲线lagrange插值函数:double twlq(double x,char* filename);& q! N: q+ S3 c D, {, B double twlx(double q,char* filename); Z/ R& s0 e4 Q, m 曲线组lagrange插值函数:0 w+ g$ Z3 l( M k, H" t double thlq(double x,double y,char* filename); / w* h. n. B- m! i5 K/ Z double thlx(double y,double q,char* filename); 8 Y! M- F7 n' R# W double thly(double x,double q,char* filename);。

# ~& b9 f" Q) l" W* o, L

例:单曲线插值函数 "带路径的保存数据的文件"结构如下:" q# K) w0 r H/ w7 D$ f$ h S: B @ Description @% l. n$ B3 p$ ~! j" P n, nsel;; _5 z2 t% X9 L( ]" w8 a x[0],x[1], x[2],··, x[n-2],x[n-1];0 m% |* x6 N. Z0 v M q[0],q[1], q[2],··, q[n-2],q[n-1];, B0 f( H/ s' G& k4 \8 P0 n& b MinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA

; k2 ]) N, D' T8 U! v

注解:0 i) o# ~/ s& S# ?1 ]& t Description:用户自定义描述字符串(Description中不可有@符号);: F3 H% u- e( k3 a7 Q n: 总插值点个数; : j" X$ V, b% H# z9 \ nsel:实际参与插值计算的插值点个数; 0 q+ p j8 G/ R Q+ u+ K. e MinX=0.7,MaxX=0.9 取值范围;& I: S/ }, E$ Z0 G OverRangeAlm=1 越限报警 1:报, 0:不报;/ Z$ W3 s" L" k. C X=电压,XUnit=mv,变量名称,单位。

! q$ ?; Y/ `! d' O

****结论: 1 x1 Y. \6 N0 ^) O4 t l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。 ) A: p6 h. [0 s" p7 b3 Z- t 2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。* M7 n! B _1 o0 Q/ j* b3 E! ]. Q 3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。 4 R- v ?: j5 q+ r 4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。

0 s+ ]8 x8 s5 ]8 Z) |

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

' B( ^+ K8 {0 x. a( P5 w [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. $ X6 G/ d6 \7 e
  2. /* TODO: Lagrange interpolating
    4 j* W- P7 |6 T+ d* C* z' ^
  3. *0 R; z) O7 ~; X: t0 I+ a
  4. * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?
    ' ?9 R1 r% J: ]4 i  _3 o: |: u. V4 J
  5. * In this situation, it could be solved via lagrange interpolating! W% d2 K' {2 h1 m
  6. *# f7 t" v& N2 m' Q
  7. * */
    / k0 q: Y. U' \* T7 T. r5 Q
  8. ; z9 Z& f+ O: _; d, Z
  9. #include <stdio.h>2 f" p$ x' e& R
  10. #include <stdlib.h>
    - I8 a9 x7 V7 Q% {" S
  11. #include <string.h>
    & v. t( `1 L5 m: x+ t
  12. ! r0 \4 ?' e1 G, Y' n9 d
  13. #define DEBUG 0
    7 i/ ^. v( r* t; y3 K. M6 P

  14. 2 W  p+ g5 M; A8 }* ?9 `' x" K
  15. static float m_p = 0.5635;
    4 q. D9 P( A5 Z
  16. static char *m_xi = NULL;$ e! O. k6 U/ T% k+ r7 Z# w
  17. static char *m_yi = NULL;
    ! t3 V- H! L  b) E; b- S2 u( v* A
  18. static float m_arr[] = {};, e$ V7 e! _( e, O: ~' k
  19. static unsigned int m_n = 0;
    5 D2 }# l) i( p7 J+ G. |1 s+ j

  20. ! _; \/ w2 S% |% [+ {- M
  21. static void m_lagrange_interpolating_usage();
    # f& ]6 P9 t/ U3 x
  22. static int m_lagrange_interpolating_set_n_arr();
    8 T& o$ W* C. r: L( k% d
  23. static float m_lagrange_interpolating();
    ( e/ G. e5 d- X5 R& }1 p

  24. 4 i6 _7 P! U6 Q  |
  25. static void
    $ _( e4 D- Y$ _3 C5 z: Z: J0 G
  26. m_lagrange_interpolating_usage() , l6 b" \8 d' f2 @2 c- G% U
  27. {6 [2 ?* O0 u, L/ |9 r$ V
  28.   printf("Lagrange Interpolating Usage:\n");
    $ S5 f6 B& `% g& m0 Y' ?
  29.   printf("bin/li -p ** -x ** -y **\n");
    : s: o# v) K8 B& s5 A+ v
  30.   printf("-p 0.5635\n");9 i% _, g, ~3 M7 y
  31.   printf("-x 0.56160,0.56280,0.56401,0.56521\n");9 N9 V) }; p; u* u
  32.   printf("-y 0.82741,0.82659,0.82577,0.82495\n");2 }; d, k0 w" ?1 \
  33. }
    5 a. w5 N/ R6 a7 M

  34. , P8 P4 y7 N* f8 C
  35. static int
    7 J4 U( u2 H7 Y
  36. m_lagrange_interpolating_set_n_arr() / @% N6 T) f; p; ?, A# @/ Q4 _
  37. {7 i" c- ?3 E* I9 v
  38.   int xi_n = 0;0 C8 S0 D# ?# J. n
  39.   int yi_n = 0;
    3 N, ^8 g; m( q/ l  r
  40.   int n = 0;
    1 n" t' q+ _' @& }0 [" ^) u
  41.   char *token = NULL;( ^5 E6 ?$ s% @9 U, B2 s% s
  42.   const char *delim = ",";, g4 A5 F# ^2 e5 L

  43. $ ~8 m# K' M& {! ]/ ^; @$ o
  44.   token = strtok(m_xi, delim);
    3 b( V8 M7 _4 O6 R9 t8 ?* U
  45.   while (token)4 j6 \- T. H$ ?  z
  46.   {* O" H8 R' C( u9 P1 m. r
  47.     xi_n++;% B3 _4 ~  f% M: t8 U
  48.     n++;, J$ t4 F& `& m
  49.     m_arr[n] = (float) atof(token);
    , Z# Z: [, h/ X+ Y( N" l
  50.     token = strtok(NULL, delim);4 H# D1 _+ ~7 k+ [+ p7 l7 P; a
  51.   }: t1 W' }1 X& Y

  52. & J7 j# y+ G1 _$ @' j. X
  53.   token = strtok(m_yi, delim);9 R4 r; P% s, H  ?
  54.   while (token)
    : R7 |" [! P, Q, R/ t% M& D
  55.   {
    9 c. S  X% D% a' Z/ X: A- t- y
  56.     yi_n++;& {& T5 C( p6 n% e
  57.     n++;% z( h) w5 D0 c2 j  h+ Q
  58.     m_arr[n] = (float) atof(token);
    5 N3 t, v& Z2 B2 ?2 J
  59.     token = strtok(NULL, delim);
    : J( U4 @9 U5 K% e: f
  60.   }
    / Z- V2 k4 z# @0 _( @8 l
  61.   7 c1 v  N& ?; F' V) o( w& C
  62.   if (xi_n != yi_n) 2 ~0 K, }) ]5 @5 e2 M& T/ x/ [" H+ C
  63.   {$ c7 }8 U+ \4 `
  64.     return 0;
    ( }; N& Y# B" w2 X( N2 R- b$ j
  65.   }3 K( E: y/ `) m5 b3 U# V% E* m9 ^! g

  66. . h. h5 f, S6 k" N- n
  67.   m_n = xi_n = yi_n;8 u, S  R" Y" y* T1 J4 Z  p

  68. 1 `+ ~, I9 s7 z
  69.   return 1;0 A# f, ~/ S0 Q' n2 J
  70. }
    8 V) J8 |& h0 N( ^
  71. % j1 ?' S5 @2 o! Z( b
  72. static float
    0 N5 v3 G( Q) D) Z/ f
  73. m_lagrange_interpolating()
    * C# R( E* _- Y# s' k1 y/ |
  74. {
    & t6 @* d$ \+ z+ O
  75.   float l = 0.00000;7 V, f3 f7 Z% b" V4 \. l
  76.   float li;: R* O* h& Q1 T: E# O( k6 ?
  77.   int i;8 s0 U; a. b$ R3 C- ~3 W. A2 a# G0 J
  78.   int j;$ k/ K2 m: ~6 d4 L: ]9 M; C
  79. $ J: u- B+ ?5 S( ]/ J
  80. #if DEBUG4 l! Q8 m( ?3 u' n7 B; Y: c
  81.   printf("DEBUG at %d: enable debug mode\n", __LINE__);
    9 o& e( T: j7 A, @. p& D3 T, P; p
  82.   unsigned int m_n = 3;; @: g/ x& L" L" w/ ^' q
  83.   float m_p = 0.5635;8 h* b; m$ \$ K
  84.   float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};' J& j5 a8 q. G
  85.   float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};
    9 I; u2 g* S$ c7 r
  86.   ) T0 i! e) a4 g1 g
  87.   for (i = 0; i < m_n; i++)* ?! A5 q! Y$ V4 _
  88.   {: |# w; I5 P  ]/ }
  89.     li = 1.0000000;; a; i1 A6 J1 _& o( s
  90.     for (j = 0; j < m_n; j++)) D5 N8 _+ k1 w' j8 I$ y
  91.     {
    0 Z/ y* s% G& N6 P7 T* b1 ^
  92.       if (j != i)
    * h: q7 C3 P8 q( i  V7 k5 Y% v
  93.       {
    ' d% G4 @6 J# m4 i4 C
  94.         li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);
    # i9 U* L/ j. B  l0 z
  95.       }
    2 y8 E# I5 J" r( I9 M2 I* h
  96.     }
    & w' i0 }0 ~8 K4 u8 I, U
  97.     l = l + li * m_y[i];
    # y* n2 m, D4 S! X$ i
  98.   }+ Y# W. G1 U7 H' Z$ k
  99. #else
    7 F+ W9 @% B: H9 E* B
  100.   if (!m_lagrange_interpolating_set_n_arr())
    4 C7 g- a  g, V
  101.   {
    1 c; B3 f+ ~  C  L3 ~
  102.     printf("Error: xi and yi counter is diff\n");; n, W; f* O3 K7 g
  103.    
    : V4 Z9 S. z' i. o
  104.     return 0;
    , a  c  K  z8 b' H, [9 f
  105.   }: C, z: H8 l, }$ c1 k6 [$ k

  106. 1 b2 ?  F4 X6 H) E
  107.   for (i = 0; i < m_n; i++) & m$ K4 ]: ]+ i
  108.   {
    5 p# |4 ?0 L  c) {! F* g' d7 f% Z
  109.     li = 1.0000000;
    9 W( ^3 i1 e2 q8 P& R
  110.     for (j = 0; j < m_n; j++)
    5 E/ v2 H3 g, ^9 ^3 q1 J8 E
  111.     {' v, x4 V' |: V: N) W# J2 L
  112.       if (j != i) ! Z# O4 o1 }; e4 |
  113.       {
    1 \! S0 }) V( N
  114.         li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);
    $ ]/ ?6 V# M! t" ]9 ^, B
  115.       }' r, Z% _4 b/ ]7 ^7 ?
  116.     }7 b: G! V$ Q4 ^4 A( L1 g
  117.     l = l + li * m_arr[i + m_n + 1];6 T* e/ H% R; P4 G: o
  118.   }
    . `$ H, C' h7 X8 l* g
  119. #endif
    * q# `' _7 r( ~! K' j8 W
  120. $ o5 I/ O* q* E! q; o
  121.   return l;/ y( |8 F8 K2 o! u) E+ Y: v; `! C
  122. }
    6 Z' f4 z/ t$ C- J. ^$ _$ `
  123. 1 ?6 j8 Z* u0 {. K$ e+ c1 I+ f
  124. int
    5 [; ^* i. `, I+ O& O! ?
  125. main(int argc, char **argv) * V$ A- j# B4 [- y9 b3 V
  126. {
    7 P) ~1 d# z9 c
  127.   int c;
    1 a3 j4 k5 T" ^3 O
  128.   extern char *optarg;; _5 n, W% n' m# n8 V: P
  129.   float res;
    % ?* }- {; m& o
  130. 0 C+ N! L. ?$ P9 H+ o$ h
  131.   if (argc < 2) - d) r. o% @. J% D% N% T8 `4 `5 K
  132.   {
    7 C# c2 c0 N, n  B2 F4 T5 ]
  133.     m_lagrange_interpolating_usage();/ |/ J  X  b6 S) O! }9 U
  134.     : o/ m' \3 H3 J1 S/ W* J
  135.     return -1;
    # p; J% Q$ L3 G$ ^; v8 j" q4 I# b
  136.   }
    " ^: P! A1 {2 q' V9 L
  137. & ]8 O5 U% j$ B$ g. q3 i, p
  138.   while ((c = getopt(argc, argv, "p:x:y:")) != -1) 3 ~" S: e) ?1 e; d4 C0 M1 _
  139.   {
    . o% _1 B7 Q0 H1 W+ C4 m4 Y1 a
  140.     switch (c) 9 J% h' x' a$ J! u
  141.     {6 D/ ?1 e1 f$ R- ?  `
  142.       case 'p':
    ( t+ X+ O" J. j$ n' A9 c+ o* Q
  143.               m_p = (float) atof(optarg);7 ^* N0 R# p: J" ^" m( E  |% e
  144.       case 'x':& k) C) c: x' |- D) m- V/ A0 J
  145.         m_xi = optarg;
    3 ]8 M% Z1 i, T# I5 |$ }( D, v
  146.         break;
    9 |9 j! [7 ?- a2 _
  147.       case 'y':
    ( o. e2 X1 i+ E+ b" W7 A# i
  148.         m_yi = optarg;' I5 O, [' Y) _+ v% \
  149.         break;
    ' |* C8 Y+ }2 J+ \
  150.     }9 C! h6 E- C- S8 s7 i( f- v
  151.   }
    3 t2 v& W' W# E# [
  152.   F8 ]2 Q, l8 [" f+ x
  153.   res = m_lagrange_interpolating();
    # I- }/ u$ h9 L  T& }: U& K( n
  154.   printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);
    1 ]( G& Z' p( l- z/ p. ?- B) q
  155.   5 G# \" y: U0 A
  156.   return 0;
    ; {! ?6 Y# d% u. g! p# m
  157. }- U) {6 F7 ~2 K1 A$ h: h+ B9 O
复制代码

作者: 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
楼主辛苦了,继续加油哈!
$ `7 B5 W4 V6 w) ]! |0 y  d
作者: 1617463814    时间: 2020-4-7 18:30
谢谢分享,先下载来康康~
: z+ v; N, v" J/ G* n7 ~# h




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