数学建模社区-数学中国
标题: [分享]插值软件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
- $ X6 G/ d6 \7 e
- /* TODO: Lagrange interpolating
4 j* W- P7 |6 T+ d* C* z' ^ - *0 R; z) O7 ~; X: t0 I+ a
- * 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 - * In this situation, it could be solved via lagrange interpolating! W% d2 K' {2 h1 m
- *# f7 t" v& N2 m' Q
- * */
/ k0 q: Y. U' \* T7 T. r5 Q - ; z9 Z& f+ O: _; d, Z
- #include <stdio.h>2 f" p$ x' e& R
- #include <stdlib.h>
- I8 a9 x7 V7 Q% {" S - #include <string.h>
& v. t( `1 L5 m: x+ t - ! r0 \4 ?' e1 G, Y' n9 d
- #define DEBUG 0
7 i/ ^. v( r* t; y3 K. M6 P
2 W p+ g5 M; A8 }* ?9 `' x" K- static float m_p = 0.5635;
4 q. D9 P( A5 Z - static char *m_xi = NULL;$ e! O. k6 U/ T% k+ r7 Z# w
- static char *m_yi = NULL;
! t3 V- H! L b) E; b- S2 u( v* A - static float m_arr[] = {};, e$ V7 e! _( e, O: ~' k
- static unsigned int m_n = 0;
5 D2 }# l) i( p7 J+ G. |1 s+ j
! _; \/ w2 S% |% [+ {- M- static void m_lagrange_interpolating_usage();
# f& ]6 P9 t/ U3 x - static int m_lagrange_interpolating_set_n_arr();
8 T& o$ W* C. r: L( k% d - static float m_lagrange_interpolating();
( e/ G. e5 d- X5 R& }1 p
4 i6 _7 P! U6 Q |- static void
$ _( e4 D- Y$ _3 C5 z: Z: J0 G - m_lagrange_interpolating_usage() , l6 b" \8 d' f2 @2 c- G% U
- {6 [2 ?* O0 u, L/ |9 r$ V
- printf("Lagrange Interpolating Usage:\n");
$ S5 f6 B& `% g& m0 Y' ? - printf("bin/li -p ** -x ** -y **\n");
: s: o# v) K8 B& s5 A+ v - printf("-p 0.5635\n");9 i% _, g, ~3 M7 y
- printf("-x 0.56160,0.56280,0.56401,0.56521\n");9 N9 V) }; p; u* u
- printf("-y 0.82741,0.82659,0.82577,0.82495\n");2 }; d, k0 w" ?1 \
- }
5 a. w5 N/ R6 a7 M
, P8 P4 y7 N* f8 C- static int
7 J4 U( u2 H7 Y - m_lagrange_interpolating_set_n_arr() / @% N6 T) f; p; ?, A# @/ Q4 _
- {7 i" c- ?3 E* I9 v
- int xi_n = 0;0 C8 S0 D# ?# J. n
- int yi_n = 0;
3 N, ^8 g; m( q/ l r - int n = 0;
1 n" t' q+ _' @& }0 [" ^) u - char *token = NULL;( ^5 E6 ?$ s% @9 U, B2 s% s
- const char *delim = ",";, g4 A5 F# ^2 e5 L
$ ~8 m# K' M& {! ]/ ^; @$ o- token = strtok(m_xi, delim);
3 b( V8 M7 _4 O6 R9 t8 ?* U - while (token)4 j6 \- T. H$ ? z
- {* O" H8 R' C( u9 P1 m. r
- xi_n++;% B3 _4 ~ f% M: t8 U
- n++;, J$ t4 F& `& m
- m_arr[n] = (float) atof(token);
, Z# Z: [, h/ X+ Y( N" l - token = strtok(NULL, delim);4 H# D1 _+ ~7 k+ [+ p7 l7 P; a
- }: t1 W' }1 X& Y
& J7 j# y+ G1 _$ @' j. X- token = strtok(m_yi, delim);9 R4 r; P% s, H ?
- while (token)
: R7 |" [! P, Q, R/ t% M& D - {
9 c. S X% D% a' Z/ X: A- t- y - yi_n++;& {& T5 C( p6 n% e
- n++;% z( h) w5 D0 c2 j h+ Q
- m_arr[n] = (float) atof(token);
5 N3 t, v& Z2 B2 ?2 J - token = strtok(NULL, delim);
: J( U4 @9 U5 K% e: f - }
/ Z- V2 k4 z# @0 _( @8 l - 7 c1 v N& ?; F' V) o( w& C
- if (xi_n != yi_n) 2 ~0 K, }) ]5 @5 e2 M& T/ x/ [" H+ C
- {$ c7 }8 U+ \4 `
- return 0;
( }; N& Y# B" w2 X( N2 R- b$ j - }3 K( E: y/ `) m5 b3 U# V% E* m9 ^! g
. h. h5 f, S6 k" N- n- m_n = xi_n = yi_n;8 u, S R" Y" y* T1 J4 Z p
1 `+ ~, I9 s7 z- return 1;0 A# f, ~/ S0 Q' n2 J
- }
8 V) J8 |& h0 N( ^ - % j1 ?' S5 @2 o! Z( b
- static float
0 N5 v3 G( Q) D) Z/ f - m_lagrange_interpolating()
* C# R( E* _- Y# s' k1 y/ | - {
& t6 @* d$ \+ z+ O - float l = 0.00000;7 V, f3 f7 Z% b" V4 \. l
- float li;: R* O* h& Q1 T: E# O( k6 ?
- int i;8 s0 U; a. b$ R3 C- ~3 W. A2 a# G0 J
- int j;$ k/ K2 m: ~6 d4 L: ]9 M; C
- $ J: u- B+ ?5 S( ]/ J
- #if DEBUG4 l! Q8 m( ?3 u' n7 B; Y: c
- printf("DEBUG at %d: enable debug mode\n", __LINE__);
9 o& e( T: j7 A, @. p& D3 T, P; p - unsigned int m_n = 3;; @: g/ x& L" L" w/ ^' q
- float m_p = 0.5635;8 h* b; m$ \$ K
- float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};' J& j5 a8 q. G
- float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};
9 I; u2 g* S$ c7 r - ) T0 i! e) a4 g1 g
- for (i = 0; i < m_n; i++)* ?! A5 q! Y$ V4 _
- {: |# w; I5 P ]/ }
- li = 1.0000000;; a; i1 A6 J1 _& o( s
- for (j = 0; j < m_n; j++)) D5 N8 _+ k1 w' j8 I$ y
- {
0 Z/ y* s% G& N6 P7 T* b1 ^ - if (j != i)
* h: q7 C3 P8 q( i V7 k5 Y% v - {
' d% G4 @6 J# m4 i4 C - li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);
# i9 U* L/ j. B l0 z - }
2 y8 E# I5 J" r( I9 M2 I* h - }
& w' i0 }0 ~8 K4 u8 I, U - l = l + li * m_y[i];
# y* n2 m, D4 S! X$ i - }+ Y# W. G1 U7 H' Z$ k
- #else
7 F+ W9 @% B: H9 E* B - if (!m_lagrange_interpolating_set_n_arr())
4 C7 g- a g, V - {
1 c; B3 f+ ~ C L3 ~ - printf("Error: xi and yi counter is diff\n");; n, W; f* O3 K7 g
-
: V4 Z9 S. z' i. o - return 0;
, a c K z8 b' H, [9 f - }: C, z: H8 l, }$ c1 k6 [$ k
1 b2 ? F4 X6 H) E- for (i = 0; i < m_n; i++) & m$ K4 ]: ]+ i
- {
5 p# |4 ?0 L c) {! F* g' d7 f% Z - li = 1.0000000;
9 W( ^3 i1 e2 q8 P& R - for (j = 0; j < m_n; j++)
5 E/ v2 H3 g, ^9 ^3 q1 J8 E - {' v, x4 V' |: V: N) W# J2 L
- if (j != i) ! Z# O4 o1 }; e4 |
- {
1 \! S0 }) V( N - li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);
$ ]/ ?6 V# M! t" ]9 ^, B - }' r, Z% _4 b/ ]7 ^7 ?
- }7 b: G! V$ Q4 ^4 A( L1 g
- l = l + li * m_arr[i + m_n + 1];6 T* e/ H% R; P4 G: o
- }
. `$ H, C' h7 X8 l* g - #endif
* q# `' _7 r( ~! K' j8 W - $ o5 I/ O* q* E! q; o
- return l;/ y( |8 F8 K2 o! u) E+ Y: v; `! C
- }
6 Z' f4 z/ t$ C- J. ^$ _$ ` - 1 ?6 j8 Z* u0 {. K$ e+ c1 I+ f
- int
5 [; ^* i. `, I+ O& O! ? - main(int argc, char **argv) * V$ A- j# B4 [- y9 b3 V
- {
7 P) ~1 d# z9 c - int c;
1 a3 j4 k5 T" ^3 O - extern char *optarg;; _5 n, W% n' m# n8 V: P
- float res;
% ?* }- {; m& o - 0 C+ N! L. ?$ P9 H+ o$ h
- if (argc < 2) - d) r. o% @. J% D% N% T8 `4 `5 K
- {
7 C# c2 c0 N, n B2 F4 T5 ] - m_lagrange_interpolating_usage();/ |/ J X b6 S) O! }9 U
- : o/ m' \3 H3 J1 S/ W* J
- return -1;
# p; J% Q$ L3 G$ ^; v8 j" q4 I# b - }
" ^: P! A1 {2 q' V9 L - & ]8 O5 U% j$ B$ g. q3 i, p
- while ((c = getopt(argc, argv, "p:x:y:")) != -1) 3 ~" S: e) ?1 e; d4 C0 M1 _
- {
. o% _1 B7 Q0 H1 W+ C4 m4 Y1 a - switch (c) 9 J% h' x' a$ J! u
- {6 D/ ?1 e1 f$ R- ? `
- case 'p':
( t+ X+ O" J. j$ n' A9 c+ o* Q - m_p = (float) atof(optarg);7 ^* N0 R# p: J" ^" m( E |% e
- case 'x':& k) C) c: x' |- D) m- V/ A0 J
- m_xi = optarg;
3 ]8 M% Z1 i, T# I5 |$ }( D, v - break;
9 |9 j! [7 ?- a2 _ - case 'y':
( o. e2 X1 i+ E+ b" W7 A# i - m_yi = optarg;' I5 O, [' Y) _+ v% \
- break;
' |* C8 Y+ }2 J+ \ - }9 C! h6 E- C- S8 s7 i( f- v
- }
3 t2 v& W' W# E# [ - F8 ]2 Q, l8 [" f+ x
- res = m_lagrange_interpolating();
# I- }/ u$ h9 L T& }: U& K( n - printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);
1 ]( G& Z' p( l- z/ p. ?- B) q - 5 G# \" y: U0 A
- return 0;
; {! ?6 Y# d% u. g! p# m - }- 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 |