数学建模社区-数学中国
标题: [分享]插值软件langrang [打印本页]
作者: ilikenba 时间: 2005-3-20 11:55
标题: [分享]插值软件langrang
软件名称:EXCEL自定义插值函数插值计算数值计算
0 ]3 D. h) p& `2 ~: q# s- m0 N* U* q版本号: 04y09m28
. b# H; e; m" b9 O* i6 P分类: 工程设计应用
, r1 Y* Y5 f% r4 D, r8 |性质: 免费软件! [' r4 i* d% Z) y
使用说明:
7 I' s+ j5 i! ]* L* U( H% A 人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点:
2 s! ]& S# w$ Q. ]
9 H5 n/ ?* ` J9 Z9 U. S 1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。
* P9 c' H$ J3 [0 i% V
2) 由专业编程语言编制的工程计算应用程序人机界面不友好,常常需要复杂的输入前、输出后处理。
4 `" C* ^, y- ]2 @6 a6 w EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。& {: O* k( E2 t" Y1 f7 c
; X) O/ u9 [2 t7 ^0 z, Q. V6 V 为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。* }$ ?: t* a6 S" r. F
单曲线lagrange插值函数:double twlq(double x,char* filename);
4 P9 K) r/ J o) m( k double twlx(double q,char* filename);
5 U0 q: n; U+ y, R, T4 W& O6 j2 a, D曲线组lagrange插值函数:
' f$ i4 m; ~% u0 r double thlq(double x,double y,char* filename);- j4 s0 {/ G1 _5 a- l# k
double thlx(double y,double q,char* filename);
n8 h& y: p* y: a2 `6 d double thly(double x,double q,char* filename);。
5 ^* s# O1 ?* `+ O+ p
例:单曲线插值函数 "带路径的保存数据的文件"结构如下:
6 t: t" s) a1 |+ i/ g, A) q% A, P@ Description @
! l+ U$ u4 L7 z, a7 E7 x n, nsel;
1 _' M5 y: [/ R: x7 Nx[0],x[1], x[2],··, x[n-2],x[n-1];& e% ^2 I" ]$ n. {+ J3 O" N; P
q[0],q[1], q[2],··, q[n-2],q[n-1];
# P% G0 A. Y+ z- u, d% l R5 mMinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA
N; o' Z$ s2 y2 \7 x. G 注解:/ S5 K. @4 b2 T" I( D4 n4 b
Description:用户自定义描述字符串(Description中不可有@符号);
0 f1 }5 `$ p g3 x n: 总插值点个数;+ Z" n& a+ |' k- t# N6 j0 y
nsel:实际参与插值计算的插值点个数;2 g w& _1 I% O& K1 f) ^
MinX=0.7,MaxX=0.9 取值范围;1 |2 c& p6 |% p% i
OverRangeAlm=1 越限报警 1:报, 0:不报;
9 \* {! ^/ O m- P6 y E9 B3 _ X=电压,XUnit=mv,变量名称,单位。
6 d1 J$ o7 j- \8 k ****结论:4 Q" ~0 w$ K* m
l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。
! H' S/ S! R% s" g9 y; K9 l 2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。& G: [+ T/ p) \% d: i4 ]' V
3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。4 D8 B% `) L O1 Y
4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。
6 D1 d! T* \& d+ I& K
附含壁温计算,强度计算,热电偶/阻,水阻力,烟气阻力,蒸汽性质等现成数据。
! a! o7 w1 q7 p# @5 ~& M[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
- 4 a& i/ D: K; T! |
- /* TODO: Lagrange interpolating
2 s! ~& B: e: ^$ @% z/ O3 p - ** M0 H! |6 S. A9 d
- * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?
8 l }( M; T! _: l; @3 g0 v - * In this situation, it could be solved via lagrange interpolating
+ y* p+ R9 p6 ` K. [8 N! d: y - *
; U q; @8 p# @1 T1 I - * */+ `/ P3 R; a+ i [- P: t
- 0 y. L3 n# d% ` C1 N
- #include <stdio.h>
' Y7 k8 M) s, ], H - #include <stdlib.h>
% w* O, H. H! J: K4 y - #include <string.h>% k$ {: x) ^$ a( ` {& H! B: G
- - d0 }7 Z; R8 s: q
- #define DEBUG 0) F& j* V; k9 a% P: ~" f
- R; u7 i! o y
- static float m_p = 0.5635;
4 e& S' A9 {, N6 r0 n - static char *m_xi = NULL; O( d3 A* h) `" _: J
- static char *m_yi = NULL;" P& l% ~3 A. `3 @+ F+ V: B: W
- static float m_arr[] = {};
@& M1 y* E/ m* [" L - static unsigned int m_n = 0;# ~* |9 l8 n/ }, ^0 S$ K( X" a1 i
$ u3 H! I* G. \/ H" M7 F- static void m_lagrange_interpolating_usage();
# O5 a" |* g o/ ?$ }, _( ? - static int m_lagrange_interpolating_set_n_arr();: N3 \% s3 Q" i% ]* Z
- static float m_lagrange_interpolating();
% r/ v7 J9 A6 Q, |7 J @ - & p1 p# ^% J* `
- static void ) n, p8 D, q+ V2 X7 v) Y
- m_lagrange_interpolating_usage()
) W# ^( ^" n$ w2 n: T - {* @& ]5 c. c) ^+ Y. b
- printf("Lagrange Interpolating Usage:\n");
6 ?0 r5 J7 w/ J+ d$ p. H; X - printf("bin/li -p ** -x ** -y **\n");
. K; m+ Q0 ~* c" N* Y7 u( z4 x$ S - printf("-p 0.5635\n");5 ]- ?0 ^% ^3 m. z' j. b
- printf("-x 0.56160,0.56280,0.56401,0.56521\n");
4 e- P; j. [* |8 S - printf("-y 0.82741,0.82659,0.82577,0.82495\n");- |6 ]( t h, C5 l8 Q/ D. a
- }5 e+ ]. A8 r/ d' [& g/ a
1 B y$ P+ A( Y& S) z) r& E3 T0 b- static int 1 u4 z1 W# E9 |2 g. o, a0 T5 g) u
- m_lagrange_interpolating_set_n_arr() & Y! R7 V* h+ O& P3 N
- {
3 {. c; I& ]) S& x4 w - int xi_n = 0;& h$ x# z2 A% Z4 }: K3 ]
- int yi_n = 0;
& h# M9 L5 J1 `; o - int n = 0;) G! l$ F- ` v6 R8 y0 @
- char *token = NULL;4 z" v( d! |& {) G0 M
- const char *delim = ",";4 G3 _: s$ v. L6 u
: P7 u# g4 ~) d. D- token = strtok(m_xi, delim);0 M. ^- ]; Y: F# m# H
- while (token)
! t+ N& Z# k% L+ t; ]( t. j t b - {
8 c* b8 I/ l9 D$ G - xi_n++;0 f6 p6 }$ H' f( a
- n++;; C9 R- B1 i$ D. l- m6 l _1 h
- m_arr[n] = (float) atof(token);! O1 b, {+ E$ g( i+ A/ d2 h
- token = strtok(NULL, delim);
- d$ B. p4 H5 \" i3 Y2 ]& S9 P - }) }8 u' ^4 f5 s
; }+ k" Q9 g9 v: r& ]' R- token = strtok(m_yi, delim);
: S; L. \- F! o [ - while (token)
- z$ U) Z% s& q* b% g - {9 M4 p% P% \+ f3 O# a0 E5 a) T
- yi_n++;, x4 \8 M8 W h7 Z0 k+ a2 o
- n++;9 p8 D: E4 i' m( I6 B% ^+ G
- m_arr[n] = (float) atof(token);
# j& ^: ?- R; O D$ [1 ^ - token = strtok(NULL, delim);
" d S' m& ^& ^8 [7 ] O - }
) d0 R! C0 T5 v! R/ x- S - 5 A9 }& o$ }3 e3 M7 ?
- if (xi_n != yi_n)
J$ A2 ?& L1 v& O) I - {
e5 u$ z! f, O# a; D5 j( e- c - return 0;$ @2 h2 e+ g# f
- }
/ d( C; c+ Z' L" B: ~/ l - : W4 j; V0 N' I, |
- m_n = xi_n = yi_n;
2 N7 k5 N$ Y1 V# h% B0 P2 x
; l: X# C/ |7 m- return 1;
; V9 @7 }" a$ m! C - }) f2 f( R* G/ @$ b# ~6 q) b+ |. \
0 }# V( ]. `( J2 Q4 b ^- static float
9 C4 Y7 b- n Z+ @: T - m_lagrange_interpolating() ) e; h7 A) O$ _7 i. Y; U
- {
: u/ V$ b) S' N$ Q' C7 X: B* O - float l = 0.00000;0 \+ `6 V F- ]8 w+ v* {
- float li;
$ e' k1 l6 i, `$ A/ A% N) Q - int i;
/ k$ d/ e# N' f0 m. k8 T - int j;: y7 t* l# V& V
- . P( H# Z0 ?4 w. X
- #if DEBUG
4 F; H& p: o* v - printf("DEBUG at %d: enable debug mode\n", __LINE__);
- T3 B: ^# T% R$ A5 n% c$ a6 p - unsigned int m_n = 3;
! l% u3 f2 \$ L3 ^# x - float m_p = 0.5635;
- c# T/ W) E# C& W: c* _ - float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
4 l$ ^) S$ @7 Z# ^1 m3 z4 b/ m - float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};% {, u$ ]! P; I. v# t; c6 r% [
- $ F1 c) C) g2 x% X
- for (i = 0; i < m_n; i++)
+ n9 p$ u% G3 X& c - {
Y- i- `8 A/ ]3 \$ x3 ] - li = 1.0000000;
+ f: `7 k3 m& j6 M" M( R- s9 l9 }4 h - for (j = 0; j < m_n; j++)9 m6 C1 P7 ]2 _
- {6 C. e5 t; k3 {1 {% b7 U% J
- if (j != i); s/ X3 a6 y8 ?1 ? ^& v7 j. ~7 K
- {! s! [* I, Z. `( {( `
- li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);5 D0 z) y7 w) v2 p9 ?
- }% G3 n( g/ Y: m$ U# q* D5 ?9 n
- }
! A* H% G! m1 Z. t3 j1 \/ I - l = l + li * m_y[i];
% V F' m: e1 n - }
0 h& c- K- g$ I - #else# `8 }* y) x7 O$ x; k
- if (!m_lagrange_interpolating_set_n_arr())
& x! @. O( {: V4 U* f. f - {
1 }) s/ `8 l2 ^! L; d7 X5 D1 V - printf("Error: xi and yi counter is diff\n");, H1 f8 j# S* a+ E. p+ @. T
- , D9 p' q& E! J" c* j
- return 0;
m5 C7 J, j& l/ v' n - }
- k8 L2 w# F5 a2 g
) L( m8 R5 q3 s: c ]: T- for (i = 0; i < m_n; i++) 7 L7 X! T0 b: Y+ j- f& U" \
- {4 n5 i/ N3 C3 n- [$ H" e: V. ?+ o
- li = 1.0000000;
3 G, i, Y- z% v( R( O - for (j = 0; j < m_n; j++)
" r# z1 N6 ^, K, w) Y. R0 P6 s& Q - {: ^: W* ?: h' `) e! l1 [& a
- if (j != i)
: V. q5 G: R, ]$ P0 h( T& u - {
; c& K A) B. ]$ ` - li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);7 J) t3 b/ C% c$ C% f& }3 p% _- W: ~
- }! _4 } D6 T1 k3 P
- }9 e! @' c$ H' E) a5 ]
- l = l + li * m_arr[i + m_n + 1];
. Q, \. O" c# \9 }) t- s - }
6 o4 v% @4 ~' M, w - #endif& J3 X2 C, @; v+ k" O. e) M
- ^. }, Y3 K i) S
- return l;
5 ?" h6 l: I& g, M5 V - }
: g7 z/ P) l1 I; Z5 R) e% W% y - - X2 E& Q$ S M) Z% P
- int 9 w+ z+ P, @: y/ f1 p4 w
- main(int argc, char **argv)
2 A( Z8 S2 w) C: Q6 D - {; L! Z0 ~6 o1 h4 C
- int c;% m" H- {' i1 B! a9 _5 {# [ u
- extern char *optarg;
4 l& p% w" X( {( ] - float res;
# a8 O* e; a# l" T# ?' T; P! T: q
' L/ F: [7 @+ Y2 _- if (argc < 2)
/ n0 q3 _) E0 ?% O - {
+ n, F5 q0 O5 h/ g o7 `$ v* Q9 Q7 A - m_lagrange_interpolating_usage();
& B" l* F( w/ s+ ` -
+ s# x2 p% e" ~& @* o - return -1;
5 e& s, C' M, t" ^ - }
; C n3 L! T3 P( M2 w
8 Z8 f& E9 w1 m+ p0 O# O- while ((c = getopt(argc, argv, "p:x:y:")) != -1) ( s! V, W& a, y9 c3 a
- {
* ~8 V" X" m0 W2 T8 M - switch (c)
' @( u- [# Q9 O1 ?. o - {
$ f9 d+ c- m# x2 B - case 'p': a% E; ?% b7 j$ g
- m_p = (float) atof(optarg);% T, R* F1 K0 m/ ~; j% Z
- case 'x':
4 P. P9 R5 ]4 T, e1 F0 X: L - m_xi = optarg;4 E t% f5 C1 b8 K! Y
- break;7 j( r k k0 S
- case 'y':9 ^, w+ V l# b) f9 }6 `4 F
- m_yi = optarg;, a2 q- c7 |; R' c4 {6 ?2 T; F9 F
- break;7 ?$ w* S4 @3 J
- }
0 _" e* B/ E! ^ - }+ N6 R2 G4 @! }( _% w( M% X
- ! p/ C" l9 z0 [8 l. \ L6 D O, E
- res = m_lagrange_interpolating();( V( h- }0 S ~0 [0 |* g
- printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);1 T2 {8 [! W+ G9 G
-
; B! S) [ w& R) V& W8 u! T - return 0;, L8 l7 ~1 @ J7 ]8 t
- }
, ~. V' A8 |% `" X* p+ u
复制代码
作者: 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
楼主辛苦了,继续加油哈!
. Y# g/ D7 R# |: [% h0 a
作者: 1617463814 时间: 2020-4-7 18:30
谢谢分享,先下载来康康~
, [3 k8 y, x; {( N3 H
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |