数学建模社区-数学中国
标题: [分享]插值软件langrang [打印本页]
作者: ilikenba 时间: 2005-3-20 11:55
标题: [分享]插值软件langrang
软件名称:EXCEL自定义插值函数插值计算数值计算/ I; O, s" ] b$ \
版本号: 04y09m28
# r3 u/ @3 A7 O! W7 T9 ?0 w0 |分类: 工程设计应用
, E, j7 W" m7 L' B# y' |5 y# q8 c/ m性质: 免费软件
1 E. V1 Z: f2 h; T6 c4 ?使用说明:
' b5 C+ X! E! I! i% t 人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点:( ?+ M& R9 t0 G" ~0 `
% Q7 t9 |/ |+ ] P 1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。
. {$ Q5 } N. O4 p8 z) A 2) 由专业编程语言编制的工程计算应用程序人机界面不友好,常常需要复杂的输入前、输出后处理。
/ {5 U# o+ W9 s0 S( O
EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。
9 a; [# Z3 ]: ]1 ]9 Q9 j1 }' n 2 i. ^8 h- o' J; J
为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。
v2 z0 P9 w& E1 B m# i/ x; B单曲线lagrange插值函数:double twlq(double x,char* filename);1 k& Q V' H: Q
double twlx(double q,char* filename);
; K8 }9 W1 I$ o$ L7 x8 A* Q曲线组lagrange插值函数:+ Y V3 K R% O* P/ e& _: B" W; y
double thlq(double x,double y,char* filename);
2 g' H: p) K5 K+ O2 d* Q double thlx(double y,double q,char* filename);
) x/ H3 |. F4 q- z* O& Q double thly(double x,double q,char* filename);。
1 x% z' r. w' s' \例:单曲线插值函数 "带路径的保存数据的文件"结构如下:9 h" O3 }& |1 `3 u6 p5 e$ [
@ Description @
9 I! R0 }/ Q7 z6 b* ? n, nsel;
6 b' `3 l. t1 O9 C1 Tx[0],x[1], x[2],··, x[n-2],x[n-1];
) I& u9 _( o$ [% w* s0 lq[0],q[1], q[2],··, q[n-2],q[n-1];
7 X, F( P2 J! g; t7 y) Y+ }; ~3 kMinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA
" W% R4 D2 T8 Z7 P9 R2 V8 T 注解:
* o, t: F( l1 x$ V; x3 v6 h) S Description:用户自定义描述字符串(Description中不可有@符号);1 O& C: h& a+ i, a" c+ @) X6 t4 \
n: 总插值点个数;
# ]' \- D. \3 m D0 b nsel:实际参与插值计算的插值点个数;4 b+ M) e i) j& Z9 |
MinX=0.7,MaxX=0.9 取值范围; c* K" e R* h9 B. o1 } L! ]! o: T
OverRangeAlm=1 越限报警 1:报, 0:不报;
# e+ `2 O- l2 q/ R2 b X=电压,XUnit=mv,变量名称,单位。
3 M% w/ ~ w1 P) l/ c4 p ****结论:' G1 q+ n9 g5 f3 W- B3 T/ F
l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。) I' C" V( L5 n3 H' P v! x2 Z
2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。: W" S6 ~6 L# [% n- M3 k6 H6 V$ ?
3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。/ y) _! H+ D$ {1 k9 \
4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。
4 h6 T% r8 B. d( X附含壁温计算,强度计算,热电偶/阻,水阻力,烟气阻力,蒸汽性质等现成数据。
/ |2 v" A4 v4 D9 l4 b% x[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
- 9 l% W9 i3 {& A+ @- \2 u
- /* TODO: Lagrange interpolating
$ C+ }6 o' U3 \' R8 S" W, y) L - *$ b9 t5 n1 h, j4 I' ^; G
- * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?
( _: e1 |5 v$ Y& L, A8 B1 V+ } - * In this situation, it could be solved via lagrange interpolating
- B" _7 c* X G' w: K' J7 y T0 J( ^ - *" Y7 Y9 |3 g9 Q* M; y5 z2 d
- * */
, j! @5 d, G$ l8 {) w* m
1 h" _* c8 e7 q$ @6 G- #include <stdio.h>
d' p" R( R" {% w1 n/ a/ v3 { - #include <stdlib.h>
1 T$ Y7 i1 R) ?9 {4 R - #include <string.h>
& a) M' f4 A1 Z: _
5 s8 n; N: e0 ~* d- #define DEBUG 0, y- n0 L, h8 b. ]) Q, g
+ i% k/ {! a0 j; \5 _- static float m_p = 0.5635;
: H, O# B! O9 m) Q2 U5 w' R - static char *m_xi = NULL;
: g$ X5 @: @5 p1 }& l" F2 L2 j - static char *m_yi = NULL;- J; P' \8 c, L8 r. h6 m7 H
- static float m_arr[] = {};
2 e' D; J$ V" `4 ^ - static unsigned int m_n = 0;/ F3 X) j- W& O
- , N0 w! _) |! I( w) u" f3 }3 ^
- static void m_lagrange_interpolating_usage();6 r' ]) K1 G4 z8 W1 L0 c$ l
- static int m_lagrange_interpolating_set_n_arr();
/ c# j3 ^* f9 o* g+ ? - static float m_lagrange_interpolating();
0 K0 K% e6 O- d; |4 \2 l
2 K2 |: x/ E, u2 y9 m4 _& e' e- static void 4 q: ]6 V! U' ?- J7 G5 P0 w! E
- m_lagrange_interpolating_usage()
, I6 U" q4 R* P% g - {
M+ M& t; a) x. R; u/ U; p - printf("Lagrange Interpolating Usage:\n");9 ?' v6 i- |! u( D0 Q$ P4 Q6 x
- printf("bin/li -p ** -x ** -y **\n");
4 C+ V. A! W8 C2 x# z* f - printf("-p 0.5635\n");
1 e3 i. C% D7 a& A - printf("-x 0.56160,0.56280,0.56401,0.56521\n");
. L4 q/ S# x( p. p - printf("-y 0.82741,0.82659,0.82577,0.82495\n");
0 Z0 i& B- g0 f% W - }
" ] U, O/ ~, G
- ?; v# A) L) c- O3 E- static int
$ b- [2 }' C. f' u- [ - m_lagrange_interpolating_set_n_arr()
1 U! ?! A+ i1 Y# N j; Z8 D& Q* E - {2 ^/ t7 d& x: v: a# R" \4 q
- int xi_n = 0;
- Z, f, i+ [- v/ s - int yi_n = 0;
( Z! T3 F; V- G: U: E# ~ - int n = 0;2 b; C2 X' z# m# M
- char *token = NULL;
1 R. h8 k8 B# M+ p - const char *delim = ",";- [- ~* l/ b0 J7 D. m0 T9 v4 L' i* n
. ?# l q0 K( v- token = strtok(m_xi, delim);
( E7 J, V3 [6 J0 M( G - while (token)
: B' j5 H' _. O1 W3 o - {/ L2 |$ u& y/ t, v. B* v6 r; z5 |/ N
- xi_n++;
( |8 m/ k; t/ H& B5 x3 U - n++;
5 d" b' n4 S( ?# e( H* t - m_arr[n] = (float) atof(token);
" {5 @' v; B$ z - token = strtok(NULL, delim);4 `$ q7 a& e6 \
- }( E I* o# e% T% P0 m
: I# H( @& _& a1 c' u W- token = strtok(m_yi, delim);
- R* f4 W3 Q. ]0 _ N - while (token)
" t7 I- ^2 }4 q2 `# d9 h; ^: Y. e - {/ h* [% R( W: d% s! P9 q' ]
- yi_n++;: I, i2 H, h2 |0 k" f/ i
- n++;( ~& T4 S! q6 K2 h2 q% l) L& Y
- m_arr[n] = (float) atof(token);
: I. f6 Y1 H, g! _% M" e - token = strtok(NULL, delim); K! T: C7 @) S! w% e- e0 M
- } f# N% a2 S4 q' f, @
-
" Q; f" y$ ]1 ?; P% p$ U - if (xi_n != yi_n)
4 X, P" g' ~$ O/ S4 l; r - {
9 T( T; w6 t* d - return 0;* |8 { B. i8 s Q( k% ^
- }
: k* i$ D1 ~8 w/ t( t. O4 `* R$ }4 ?
' r0 S7 L6 T, Q5 } X, z0 B- m_n = xi_n = yi_n;
+ P. X) m! P* H- o( Q5 R# K8 b" |
l& `! I* r" T- return 1;
, _' U; z/ I# }8 j% y/ T - }6 I, [! K9 w; U& x4 [: l* m; e
- 0 A4 B( L9 V0 }
- static float
8 w8 r. h* i) A4 G5 y+ U - m_lagrange_interpolating()
/ c4 d7 c6 `9 v3 ?; S" z( ^ - {
, ]% N2 m8 ^* o - float l = 0.00000;: b; W7 ]! E; Z
- float li;
( _; {5 E( W# V J( p - int i;
4 z/ u" f1 O; c2 F! T - int j;# T+ Y2 ` k2 g R' A
+ d) Z0 P8 [; }" t# n5 z# p+ A- #if DEBUG
& `/ R2 j# S1 S8 N - printf("DEBUG at %d: enable debug mode\n", __LINE__);$ r( Z7 q7 ~8 x1 F% u7 j- s
- unsigned int m_n = 3;; W2 U* \% m! F. C: ? u" J0 X
- float m_p = 0.5635;
* H U. h3 s# L9 i' @' L - float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};) @# }" ?- c' L' p0 \( @% @
- float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};
1 R+ d1 i! S v1 _0 K - H; I; r" ]+ c( o
- for (i = 0; i < m_n; i++): C& [# A1 y! C( i8 ~# x
- {6 Y3 A! j9 q/ ^6 X8 f( r& R6 m8 U
- li = 1.0000000;
P; D+ b8 g5 Y+ m+ Z - for (j = 0; j < m_n; j++)
7 T) z7 Z% Z l/ F @$ X - {
" j( k" C' j& n& X - if (j != i)
/ p3 K- u1 p8 g8 q - {
- @; {4 u# E1 W7 j! t - li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);
. O5 ^" n2 b9 K6 R8 u+ O- l - }
. Z V! x9 W; c2 K% O& B - }7 E! K1 G+ H& w# R" u: k* f
- l = l + li * m_y[i];4 ^; F9 C/ O; y
- }
: N, ?, F6 w9 E: F. N7 L) x( t - #else' R4 `% G1 ~/ ]( n
- if (!m_lagrange_interpolating_set_n_arr()) ; y. V1 @, ]" O8 L9 b* f L4 W: _
- {1 Z* z! `* j: ]
- printf("Error: xi and yi counter is diff\n"); k' y2 T8 F! h
-
, H5 ?2 L/ R. q, u7 ?% | - return 0;4 N e9 X, h" e4 k% `
- }
" q2 F1 f/ I5 {8 d& B+ u( t
. U0 A* Y7 z. d2 ?" S' P8 a- for (i = 0; i < m_n; i++) 8 I5 x% g V, k; I5 r% K
- {- |( h* s$ C; C
- li = 1.0000000;
( n6 W9 m) Y+ Z# K3 j3 m - for (j = 0; j < m_n; j++)
7 a. [+ y; `) [3 [6 j4 e - {
) T& R L! S- `4 p1 L4 Y - if (j != i)
7 g. p/ R$ ^# ~/ m0 ^: k1 I - {6 Q6 l- b* {( V4 Z u, M
- li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);
- B9 D' j, j! |4 k$ \ d% u - }; F, s) I5 Q [% B0 d" N; k. _
- }1 z3 I( K- x2 a4 z" l# E
- l = l + li * m_arr[i + m_n + 1];/ o' V! I0 W+ l* q+ m4 N+ r
- }
( \3 p) N) V6 a% o5 y: b7 T5 O - #endif9 x$ \7 z& a- u$ \. V. r9 p8 O
/ l V' e+ z5 R# e. G2 H- return l;& S5 k" [3 T1 |" T, e/ U3 U
- }- p; c& b/ X1 x/ T2 b* k) ~
- 9 I+ j; D* a) l+ S1 {
- int
2 S" u2 p1 ]' {" [6 ? - main(int argc, char **argv) ' ^+ {% D! l# C
- {
1 i' R4 q4 e4 n* ^; Y& v* m - int c;
% d7 w* _$ C0 ~& u& a( D - extern char *optarg;7 C) d5 F% D1 A2 x
- float res;' e( |2 D3 A/ A8 P
0 H8 k/ V1 O; H1 M! l- x# K* ~; H; b- if (argc < 2) 6 S; `; D# U+ M6 w, {3 w2 ?& G0 D
- {
) Y! O3 k5 C/ j1 J - m_lagrange_interpolating_usage();
4 g% W5 `% u v8 w+ ^+ o+ _ -
$ c o! Q$ T F- R - return -1;' ^! L6 g' U0 h ~ ~$ o( P9 b, n
- }
* M8 U5 }. A, f U# x - 0 V1 e0 b: [- f- H7 T
- while ((c = getopt(argc, argv, "p:x:y:")) != -1) , J$ w# d9 k1 ^1 R
- {$ E. N( o8 X. N. L/ `* ~6 G
- switch (c) 7 U- p& D1 Z, c. a+ m& D; b, l) Q# b/ q
- {
1 u9 d, @9 z7 t n- B9 t1 A# |, w - case 'p':
; a; `- Z: q" l - m_p = (float) atof(optarg);1 K5 V! _& |; `' U0 V' f8 ^
- case 'x':
5 Z2 P/ y( V6 F - m_xi = optarg;
. a! `6 s1 l. ]% P/ t) `7 c! z0 Z( G - break;; Y$ Z8 w c6 K" n3 c. \8 b
- case 'y':
9 W$ ]. O7 z8 i, H/ S - m_yi = optarg;$ | a2 S8 J! l( w. E7 Z: F: H
- break;) s. R5 L4 [1 g. w! L
- }
7 C0 K& u" _! e. ~* | - }
' ]) r1 z( y, X$ C4 R* [8 |
E8 m( ]( A' R- res = m_lagrange_interpolating();# _$ Z5 O& ?, Y0 d0 c/ k
- printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);* |; \: d: F* J8 j' h ^
-
8 @3 h0 D& f4 t# k7 ? - return 0;- a: V1 j: s+ `/ ]2 a c$ o
- }; O+ [3 M* j: R
复制代码
作者: 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
楼主辛苦了,继续加油哈!2 i0 S7 c6 F; o0 ^& U$ u6 L; Q
作者: 1617463814 时间: 2020-4-7 18:30
谢谢分享,先下载来康康~
8 D! ~% ~/ e$ l9 S
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |