数学建模社区-数学中国
标题: [分享]插值软件langrang [打印本页]
作者: ilikenba 时间: 2005-3-20 11:55
标题: [分享]插值软件langrang
软件名称:EXCEL自定义插值函数插值计算数值计算) `6 n5 S, w7 R' V2 T
版本号: 04y09m28
! s% V$ F' u: p( [) T4 ]分类: 工程设计应用
, Y) p% F$ o& | i1 G性质: 免费软件
# K5 C; k8 D2 H8 N) C; o) v$ _* b使用说明:
2 e" E# ?1 d! v/ b7 e4 A( u6 w& i9 o
人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点:
2 b4 z7 m4 V1 }4 a/ V' _- E: f" E% H
. u7 m% D' f( \" b 1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。
& ^7 B5 d, Q+ m 2) 由专业编程语言编制的工程计算应用程序人机界面不友好,常常需要复杂的输入前、输出后处理。
6 B" J) w7 t: C5 ]& z0 W6 \
EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。; d0 ] N+ r9 H. E
& F; M) F2 a% X2 v' s4 R
为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。
}) F7 {; X2 Q" G3 V! A单曲线lagrange插值函数:double twlq(double x,char* filename);) j6 p9 C. M# u; ^* ?3 E. w9 }
double twlx(double q,char* filename);
$ N7 _( _8 c5 F/ `4 a# Y0 P曲线组lagrange插值函数:( ^+ J* x. z5 D
double thlq(double x,double y,char* filename);9 {( N. s7 F( P. |1 H7 F
double thlx(double y,double q,char* filename);
+ \7 I6 f2 F; W& O( ^. \ double thly(double x,double q,char* filename);。
- ^/ g1 L$ ^/ W! }1 b例:单曲线插值函数 "带路径的保存数据的文件"结构如下:' A0 _" r7 P( y
@ Description @7 ?& {& j" s3 Q$ `; t$ I* `
n, nsel;
5 T6 R& c4 w3 ^+ h& X, ?4 qx[0],x[1], x[2],··, x[n-2],x[n-1];
* U: K( S9 S* P6 {; Iq[0],q[1], q[2],··, q[n-2],q[n-1];5 I. U' L+ t0 ]1 W1 l
MinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA
- i6 }2 o3 f; A7 M: M+ d3 A( ^ 注解: z! ?- @! {' d" ^4 D( u' C+ h; [
Description:用户自定义描述字符串(Description中不可有@符号);
7 p; }: |9 z, }8 W* j1 A n: 总插值点个数;
' F6 _2 H0 B/ Z: M nsel:实际参与插值计算的插值点个数;
% ?/ a# G S$ a0 | MinX=0.7,MaxX=0.9 取值范围;3 @( r) q/ K: Q
OverRangeAlm=1 越限报警 1:报, 0:不报;1 U# x/ ^6 y7 c9 }* S3 \/ n: r4 I
X=电压,XUnit=mv,变量名称,单位。
* @2 M/ m0 r) i. { ****结论:4 y. t; `1 X8 d; s
l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。
2 u% @, s# U; o 2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。8 y' P2 a6 T, O0 V, ?; Y
3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。# k" U" }5 a* F6 a2 \1 E- {
4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。
9 x# u4 c' ~( c& g
附含壁温计算,强度计算,热电偶/阻,水阻力,烟气阻力,蒸汽性质等现成数据。
+ k2 d4 {% X+ z# y- {, ]' K[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
2 V! A/ H* ]: h2 u. [- /* TODO: Lagrange interpolating 8 C) [- @# g! [. e `
- *( Q4 d5 T y# X/ \/ S
- * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?+ ]# I: [& W: P# `1 }
- * In this situation, it could be solved via lagrange interpolating
1 f1 y. W8 R& l2 l4 S I - *' \; p) K" d1 H# o D+ ?( l
- * */
9 r2 w) D1 a& n0 h9 {1 h; R
3 B) o1 X; o6 k) ?& D- #include <stdio.h>
g/ m0 V( Q+ p$ N& D" R) B& ? - #include <stdlib.h># S$ p ~2 f2 F6 b, S1 ~+ k% e$ j
- #include <string.h>9 I3 d- V9 o* O9 }+ h- D
- 9 N( C' D& Q: ~% t5 Z
- #define DEBUG 0
! q& R! L% a* T8 J - / o& T& t. @5 \4 O# @+ j: f
- static float m_p = 0.5635;
w9 N3 R5 w3 _ E- x5 d - static char *m_xi = NULL;
% j5 M9 U9 W0 V2 I$ | - static char *m_yi = NULL;
s' Z8 f Z+ c* L - static float m_arr[] = {};
2 ]; Y) X- Z; V2 M- B - static unsigned int m_n = 0;
6 M K) t. [3 G
j, D& D& a4 v" W% J- static void m_lagrange_interpolating_usage();& }: Z: x. q/ r9 C
- static int m_lagrange_interpolating_set_n_arr();
$ W* Y4 d) y$ s4 R' {/ t - static float m_lagrange_interpolating();
2 ]; m' m" G5 _
6 p0 L6 C! }9 o |- static void
7 G, D9 `% ^3 ^6 a# q# Y - m_lagrange_interpolating_usage() ! a0 h% I- s- H0 D$ _
- {
" M7 Y0 P; f$ ^. J1 ], I- ? - printf("Lagrange Interpolating Usage:\n");
9 E3 E( q& s) z' v* c - printf("bin/li -p ** -x ** -y **\n");
0 h2 G s- c1 d/ q3 d - printf("-p 0.5635\n");
5 z2 l0 M8 ~& r7 n9 q5 u3 x v - printf("-x 0.56160,0.56280,0.56401,0.56521\n");2 a; u, u; `6 H( x7 _" T% y" L8 Q
- printf("-y 0.82741,0.82659,0.82577,0.82495\n");" n0 `3 F" P( f3 C
- }! f# G# U) M4 w
- 1 J# V. V: {+ m; @5 ?
- static int
. \, r% X7 Q9 F) C" A6 P - m_lagrange_interpolating_set_n_arr()
0 I" z7 F+ ?! ~6 G - {
C' R. l! f' {% b: a - int xi_n = 0;
' {: z0 ?' D5 c/ i - int yi_n = 0;
- v# R% ^& u8 k& R2 ^9 W& O - int n = 0;3 t+ A; v0 S( F' ?. e
- char *token = NULL;* |- Y8 Z+ h! Y% W. i
- const char *delim = ",";
- j6 j0 S: R2 P - # M; N- \) w( P( g) Z
- token = strtok(m_xi, delim);
, y8 _% L4 M4 ?% @ - while (token)
' K! _' D7 b7 {3 T8 ~ - {
5 Y. O/ w* y! c4 V8 k4 ~1 r - xi_n++;% ~3 W( D0 }5 V
- n++;9 ^. S) N j: r) J
- m_arr[n] = (float) atof(token);4 K* @9 w8 Y$ {/ A: I
- token = strtok(NULL, delim);, | O3 F$ C( V2 S2 ^) l- ^) I
- }
1 s' M" j& F" o( l0 ^7 I) x - $ K9 ~1 p$ L2 Y; @8 \
- token = strtok(m_yi, delim);& K. R- x" x7 ?/ x6 o$ v2 Z
- while (token)
6 \3 E6 O' I% k! L) t; G `* I% V! c - {
$ @: q3 |9 D% ]: s0 ` - yi_n++;+ s; t' n+ r! l5 f: d) x) V
- n++;2 d$ n8 k( N0 v, r9 u6 c
- m_arr[n] = (float) atof(token);( g& m7 R: ?% _+ a& s
- token = strtok(NULL, delim);
. s: M% K+ E2 [( ?+ a7 O# s - }; A, b, i+ p) d- p3 Z7 W$ e, M4 L5 ]6 {
- ) g" I1 R8 g2 D& j- [1 y& B
- if (xi_n != yi_n) : E) l ^) R3 q2 p5 w: B# \; U
- {
- R5 }6 a+ x3 q+ C% u' V4 B - return 0;1 A4 q, b+ t' @% d6 ]' p' W
- }4 ~ y1 Q3 N" K0 R* n! E
- / l5 e' f9 e; r
- m_n = xi_n = yi_n;
$ `: C* w# k5 U2 e, p - 7 N' V# a/ _" c. x% z9 `5 m: N
- return 1;- @8 l! ]; _# x S- V
- }
7 U R0 s5 r* B4 ?
7 @( Z" C+ G: G- static float " O; u/ ?" E0 `8 ]$ x: o, y
- m_lagrange_interpolating()
4 O \9 o3 u8 Q/ C- @2 G - {
; {( {/ |2 ~6 S# [; X* u# N - float l = 0.00000;) P! j2 f( ]# J) U1 K
- float li;' y0 a5 [8 g6 Y3 p1 c% W
- int i;
, q& \1 i9 I7 | j/ m3 X0 O- z - int j;
" h& f% ^/ Y& ]+ w$ ^
* e8 v4 w( T( A1 g# {- #if DEBUG
: o7 c" s5 n7 Y1 [. }: f' e - printf("DEBUG at %d: enable debug mode\n", __LINE__);( X5 ~8 _6 G( U3 W' L
- unsigned int m_n = 3;4 }# d4 R5 \! }3 i
- float m_p = 0.5635;8 y L# p$ ^6 m+ E$ u- {) G5 _% k
- float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};$ d3 u+ g, N. y
- float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};1 x- U3 t1 B$ H+ `' d& ~+ y
- / f/ _: T$ v W3 w1 I% H8 ]
- for (i = 0; i < m_n; i++)
# M4 C# E3 s/ X! }8 B1 ~& v - {! N2 ^; S; p# ]$ d% x1 P3 ]
- li = 1.0000000;( q0 f1 h; ?8 @
- for (j = 0; j < m_n; j++)4 v8 p7 P8 k$ O. Q0 i; ]) k$ w3 H0 D
- {3 M1 ?( h: z( }+ V
- if (j != i)
% C" r( j. R' y; Y9 l1 M5 y, h - {! E, x2 w0 x" A% r" a6 S; U1 j7 W
- li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);& a" F% D6 w0 J
- }
) O# r" P, g5 ]$ u4 d- I) e( r$ l - }! A2 |0 X7 W; i/ V" q1 f
- l = l + li * m_y[i];9 c! b3 s, B# P. J3 a
- }
1 ~ j# A% X i" T - #else7 w8 v# d7 z8 Q z9 J6 H
- if (!m_lagrange_interpolating_set_n_arr()) 7 I& \" m6 f" N. s$ H$ |2 D
- {
4 Z/ ?' d% T: s* p( X% S7 S - printf("Error: xi and yi counter is diff\n");
" b2 I. R/ n, e* e# j" p& P - 6 A9 l9 | p" f# S# X
- return 0;& R. O; v+ X+ H- T4 S, P1 C5 M4 A/ t
- }9 V1 ~0 {$ y7 J/ e- O
- / z7 F4 C, c0 u
- for (i = 0; i < m_n; i++)
+ _0 v2 t" A/ x" {1 c% h; i( f* { - {
2 M: r9 Y8 V1 m6 u7 @/ r: w - li = 1.0000000;& {+ O- v/ I8 |
- for (j = 0; j < m_n; j++)
- t3 ]9 o4 l& l; p6 \: _' ]' M - {" @( `1 f! g7 ]# F2 W/ {! A& k0 }
- if (j != i)
0 N) e3 c! I( A9 O - {& @" K, _; x$ z* ~, P
- li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);
% j8 K# J3 p- h' i: ^ - }
/ V9 W: ]5 a5 Z: X0 {$ c6 e5 C8 d - }
3 ?, d# e& X6 x$ \ - l = l + li * m_arr[i + m_n + 1];2 {" j4 Y: f' c' `
- }
& P/ ]/ ?0 h1 N- K4 L - #endif
# J, d* {$ X3 q - 3 [% G$ x$ y4 _# z8 x
- return l;, G" @. T; K9 y6 C8 U |8 Q
- }
! d; N+ a2 H4 L6 U! k
0 l3 s, ]7 t+ i& {: t- int
( g, L' k# Z% W% V3 S - main(int argc, char **argv)
9 H* N$ u) {! u) V - {
z6 H- [1 ]! m. C2 j - int c;4 X% y4 e8 W3 D) H
- extern char *optarg;
" e; c6 }* e2 n% ]3 R - float res;$ y3 J% L' |9 @5 u& C' w9 [7 i5 \8 F
- , c- r- o& w6 [# x% N/ n' N
- if (argc < 2)
/ u2 X# g7 V! x1 k& f6 v! A - {! R" U- P# r% s
- m_lagrange_interpolating_usage();3 A, i1 l5 t* L& `+ A3 u0 h
- ; E a5 m: a! x- j# w8 y
- return -1;, R, m) t( d3 a6 x- M* |
- }
$ U8 D2 i" d! I* B0 V" { - & c/ Y$ R& Z1 g4 C. x
- while ((c = getopt(argc, argv, "p:x:y:")) != -1) a2 q# J# J1 `, f7 J/ D. z) m1 I) U
- {
2 K. S- H2 _% s" d; |+ s2 m: |; W" V - switch (c)
+ R" p- o. v' r* F - {
& i p# W% S+ ^- P - case 'p':- e) A! q6 C3 A: T
- m_p = (float) atof(optarg);
" q3 H! U# J( i( y0 x - case 'x':
8 ~( J$ ]) k5 V! I `5 ^ - m_xi = optarg;+ R& i5 L4 \ H8 R) t" i: p
- break;$ Z6 p- ^6 k$ N ~0 f1 u
- case 'y':
3 c+ Y K/ A, R2 V" l: d - m_yi = optarg;
- l- l' O; c7 \" O* P - break;8 w) I/ l, O6 _* f# A/ y
- }1 O1 k! _1 P. v+ h& q6 x, K
- }9 i2 n% @2 z( b: G5 n4 P
3 |, U6 M% A0 q5 _- res = m_lagrange_interpolating();
2 ~& W* @) V& h' O+ B - printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);# x9 k: O( ~# v6 Z M
- * L4 v; F5 s* K$ {- w
- return 0;$ S) c2 I: J1 Q" T" K5 y6 |/ g
- }, d8 p) U& {4 f m3 V ]! l$ Q
复制代码
作者: 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
楼主辛苦了,继续加油哈!
* f3 D+ A% D7 P4 ~! \, s
作者: 1617463814 时间: 2020-4-7 18:30
谢谢分享,先下载来康康~9 c! K- h5 U* ] l4 `; }5 u
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |