数学建模社区-数学中国
标题: [分享]插值软件langrang [打印本页]
作者: ilikenba 时间: 2005-3-20 11:55
标题: [分享]插值软件langrang
软件名称:EXCEL自定义插值函数插值计算数值计算. j' `- |% c& T: Q1 R" d& N% c1 Z
版本号: 04y09m28" y7 M; [" | G; T2 A) U; {
分类: 工程设计应用
4 v$ W! P( j8 v4 L( i* N性质: 免费软件2 |) v7 w& b2 \, n0 D1 e) q9 d1 f
使用说明:
; B5 O) W) o* [, S* t# C% ? 人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点:
/ I" l) L) d# m4 I6 Q1 p, [, q6 K/ U 8 W! H3 [% ?3 t6 A) r2 z, g4 I
1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。
0 Z1 O% |, C+ d2 k 2) 由专业编程语言编制的工程计算应用程序人机界面不友好,常常需要复杂的输入前、输出后处理。
* k4 V& L* Z9 o1 Z4 e
EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。
/ q* z( N6 q$ A5 X; X/ X4 Y
& p9 H0 S$ ~# P# L* L+ v1 \ 为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。
% ]$ v6 y7 s. D, v+ B单曲线lagrange插值函数:double twlq(double x,char* filename);3 ^: z+ U; z) T$ O$ `3 J& i$ a
double twlx(double q,char* filename);
# H9 y7 b2 a9 J曲线组lagrange插值函数:
; q4 Y0 V% K/ q, {' j4 H" | double thlq(double x,double y,char* filename);
1 _# m; e* I9 ` double thlx(double y,double q,char* filename);. b4 r& N% Z8 L3 ]; z5 o: D
double thly(double x,double q,char* filename);。
* w$ d$ c- Q% `3 D* }" g1 u. N例:单曲线插值函数 "带路径的保存数据的文件"结构如下:9 V3 y1 f# i! \9 |6 T
@ Description @
7 ~; P9 S) o; { n, nsel;
5 K' o8 G1 Q; r4 nx[0],x[1], x[2],··, x[n-2],x[n-1];
' J- J, Q) G- Rq[0],q[1], q[2],··, q[n-2],q[n-1];
: N( ]0 T, m8 x2 z! V3 n1 l& r8 |9 rMinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA
; l4 A8 [" F4 h e 注解: a) k, \& b6 @ o( x
Description:用户自定义描述字符串(Description中不可有@符号);
- P( O) L2 G& r" F- }3 a n: 总插值点个数;
8 a! |' B% o, I nsel:实际参与插值计算的插值点个数;( X, t8 S1 l& U# t$ P; Q2 ?
MinX=0.7,MaxX=0.9 取值范围;
7 h/ P! K! ~+ d OverRangeAlm=1 越限报警 1:报, 0:不报;" d, V4 n: x/ \, `# j
X=电压,XUnit=mv,变量名称,单位。
4 w% F3 w5 d2 ^, e ****结论:4 ? n6 Q% n% Y# `- {' X3 t
l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。
5 h4 y; [6 H0 A- T, D$ D8 v 2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。& j8 N! N/ o! X* U
3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。
7 x( \, }4 d6 S) `& s6 A, C: Y& ~ 4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。
7 g$ `9 _" \- A* A附含壁温计算,强度计算,热电偶/阻,水阻力,烟气阻力,蒸汽性质等现成数据。
. F" m/ Z3 v( H* T$ `$ U' t$ I
[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
' Z* | ]4 d' S& _% b- /* TODO: Lagrange interpolating
& r; K; Y; t+ y' Y* t3 e - *
6 e4 X$ C( v' n1 { - * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?5 X0 J! ~# f6 k9 [1 q! U
- * In this situation, it could be solved via lagrange interpolating/ ]$ m) V8 Y. s' L1 |6 P& ]
- *
' Z$ x+ ~3 J% D% ~- d' T - * */8 B; b) m% Z+ q* X3 e& }3 w2 q
- " X* y& H: t. j: Q
- #include <stdio.h>% \5 Y# T! r0 B6 T+ K
- #include <stdlib.h> m0 X$ m) H. P8 @/ r0 D5 n. q
- #include <string.h>! ~0 \" X$ S, I
% l* V2 O+ V9 }; {- #define DEBUG 0
) b' R% ?8 o4 A* ~1 r
/ V; ~) c6 Y2 T; k+ n. {- static float m_p = 0.5635;7 O" z* s/ G. R; B C, t
- static char *m_xi = NULL;& y- z" J( M- ]' L" H6 u* Y" J
- static char *m_yi = NULL;
3 i6 J! x& k# k/ y5 u - static float m_arr[] = {};
6 @: m1 v6 t t( X - static unsigned int m_n = 0;2 M7 G$ f' M2 y% x+ k9 I
( a H# j3 d$ T5 ^- static void m_lagrange_interpolating_usage();
/ J, I" q7 R) _; l' |$ t- I9 ` - static int m_lagrange_interpolating_set_n_arr();
4 N: i5 f) ^9 Z# Z4 } - static float m_lagrange_interpolating();
3 ?: W* w# l/ l7 u! R: O/ h' | - # B' |) ~" n1 Y4 h
- static void
9 h3 Z9 P# j G2 a: n - m_lagrange_interpolating_usage()
7 L; M8 H. E0 f( d7 A - {
0 W( M3 W6 F% J& K1 U1 Q8 }; L - printf("Lagrange Interpolating Usage:\n");$ a$ i$ ~! k, {$ e7 J3 Y
- printf("bin/li -p ** -x ** -y **\n");
7 z" M# ^" K( ^ - printf("-p 0.5635\n");
. ]6 m5 s. t8 v2 O& l: X& N4 {/ a$ k. j - printf("-x 0.56160,0.56280,0.56401,0.56521\n");
, e# |* @7 p$ M5 E& x+ N3 M - printf("-y 0.82741,0.82659,0.82577,0.82495\n");
! H/ O; p! ?& s" F7 n Q( V - }' N, c# P& D/ [% V4 A+ ]" K
5 Z$ ?/ P) E* D" b1 {( B4 f- static int
5 R) N4 F9 J% D - m_lagrange_interpolating_set_n_arr() 7 f$ S7 e' M1 ^$ I8 c
- {* h" z |/ @9 J `
- int xi_n = 0;
1 v. B7 E. B- x" X - int yi_n = 0;
/ u1 v" c+ `8 j9 Q - int n = 0;
# U) i, T* h2 s - char *token = NULL;
# _8 u/ g0 `7 O2 s7 p! v& v - const char *delim = ",";. O. y& P/ \+ b4 j, R% z- O
- 8 Y3 B- a. t4 i. m- T0 ?
- token = strtok(m_xi, delim);
+ D4 f- f8 t/ O - while (token)
# W& ]8 W, l/ Q - {
( f5 u+ R q* N' k$ z - xi_n++;
0 o6 j2 Z0 r' J1 i% L) ]- K/ u - n++;! K$ h, ? g4 k; s& z7 o# i% c
- m_arr[n] = (float) atof(token);: Z/ ^+ T4 [7 q0 H
- token = strtok(NULL, delim);
' O! N9 b! P+ ] - }* C$ N8 ?0 Q/ _" V* p7 A' k: T
- 1 `2 Y4 O- E3 L
- token = strtok(m_yi, delim);8 B9 C( Q# d6 E
- while (token)
% m: R2 o3 w0 I" h8 w: y* R - {8 G( w( z5 j# ]8 w1 H1 {
- yi_n++;* t7 X8 S- s4 M
- n++;- w$ R e, b) i; s' T* a% a
- m_arr[n] = (float) atof(token);$ n8 Z5 h: S1 `, ]
- token = strtok(NULL, delim);
1 {% q1 }% o/ F1 i! ^# g - }( O" ~& d7 n3 ^1 ?8 P) q( n" x
- & B9 v" r0 l7 n
- if (xi_n != yi_n) " L+ T2 ^8 s; r
- {
5 _ S/ H+ g; H" R7 H/ l/ U4 Q - return 0;9 E" Y, @' J* G( V! D7 X# Z
- }
# C. c2 o8 q+ `7 h0 j# s, q- k9 E - , M% I- a7 L& L4 B- s$ M% |3 a
- m_n = xi_n = yi_n;- m8 h/ k; `# E. r: `: R. ]6 F" J
+ f9 B1 ^7 S, Q+ I, @7 }- return 1;3 q! ^( R2 }$ x8 X
- }
% L& j5 m1 ]6 k1 c3 ]5 U1 s
4 z' o" z& n5 t1 z" D% U- static float
" x) Q+ N5 w# f. {: ` - m_lagrange_interpolating() 2 b, w. f* i$ {* U
- {
' s1 q* G& z J. a - float l = 0.00000;6 H7 A% O" p4 I/ u* Z
- float li;* ^" P# e0 v# z8 V& D
- int i;
% c! ^5 `" O) Z5 t - int j;4 v; R' P: k3 k F( g
' k0 B, J) _4 H3 B+ G- #if DEBUG4 o ]& s) l6 `+ }, @/ B9 J7 G6 q8 D
- printf("DEBUG at %d: enable debug mode\n", __LINE__);9 N1 p: E& M w+ ]
- unsigned int m_n = 3;
) i0 Y* ?% c u- e3 S l - float m_p = 0.5635;+ v; b T4 c3 X5 R
- float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
Z1 Z/ `9 V+ u% H& z w - float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};9 \5 I G; y$ D" M- ]
-
& Q+ O- P( v" z& G' v! a. P - for (i = 0; i < m_n; i++)7 N/ t- v4 e( ^5 h+ n
- {
( F6 ?, V2 K% U; ]+ W' w - li = 1.0000000;
& U. T' u3 g# |( f* I# X, X! R - for (j = 0; j < m_n; j++)
5 |% I8 b7 Q9 W9 y1 _5 } - {& r; D$ f) e0 L/ z- w
- if (j != i)
! X1 [/ i% g% c; P - {, n& y( }. F. Z) s, c/ p3 f3 Z
- li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);
7 }; j, u1 n, K' w( h - }: }+ H" R5 U7 G1 m! n# R
- }
; _0 _2 Q K& A$ w) S4 P - l = l + li * m_y[i];5 H: K% ^# C1 k+ x$ W( y/ J
- }
* y C/ K C9 T' B/ E - #else
' D) a2 ?8 y% p0 n - if (!m_lagrange_interpolating_set_n_arr())
: J3 z4 H4 z* A4 I, l" v6 _ - {6 R3 q) i+ O0 V" n! t
- printf("Error: xi and yi counter is diff\n");
5 E+ n9 N8 s- G% A$ l2 d7 Y) v: W, Y7 R -
, ^2 X8 V% i5 u/ |) w* e7 B - return 0;
# \+ R% T/ w3 R: p, J# m# k" k - }% W, k6 e$ _" H( N
0 x% N$ w/ P. W: p; O# X7 g3 F' o- for (i = 0; i < m_n; i++) ; J( [' v3 X* s. W# Z1 ~ `& H& t5 T
- {
) L: Z/ R$ G( g1 U - li = 1.0000000;
& W O E8 P% Q- ?4 x: g/ Z( r - for (j = 0; j < m_n; j++) ' y4 _) V0 D5 H2 U3 v
- {' H6 a) Q$ w4 u Z7 h, h# b k+ X- h) X
- if (j != i) + B& i: p# @5 m( d$ [
- {
& b1 t3 p8 P1 M6 {" t5 M9 d% | - li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);& a9 `, V$ a3 Z" d; {% R/ k
- }
, [$ k1 U, q2 m3 {0 q$ G - }
" o( O" x0 y4 c5 X' C/ r - l = l + li * m_arr[i + m_n + 1];1 s; x& O7 B7 J+ V; S* }
- }
4 R; F9 X. J/ G* j3 I. d3 [ - #endif$ i9 D! O6 B& ?' d1 V9 U3 M& o
2 g: x) }2 ]% A8 i3 F- return l;' ]8 B# ~; j! \; x. R: U
- }# f! O& u( O* y' M( q
1 r, M- z7 w& D& a& T" {* A8 |- int
* P3 V! N, }( }8 g' e5 L - main(int argc, char **argv) 7 R; C2 _, }1 }( x9 c0 V/ w
- {
7 P0 s5 d' F7 d' R - int c;7 `& L3 Q" U* K6 _
- extern char *optarg;# c' [% U, H7 {( ^ V7 U- D
- float res;
5 J8 B9 a, h! }" z/ f
* a6 J; [9 y' h) z- if (argc < 2)
. b1 u" T$ n- U& w h - {
% C4 X4 @+ F9 ]2 J' ~" [8 D - m_lagrange_interpolating_usage();
5 K" x- p/ @: ~! q" l5 f$ v* q# j -
) \7 c9 P( ^2 @# R/ g - return -1;4 c5 n/ b7 p5 A% ?+ X& l d' S* \8 L
- }& o* h6 b6 @6 R6 V7 ]
- 4 J/ f2 O% X3 M
- while ((c = getopt(argc, argv, "p:x:y:")) != -1)
$ U ]5 L7 h( ^ - { A* @/ F. @: c6 c6 j0 U% B3 _6 @
- switch (c) 7 u4 @% y' F2 G! C2 g+ L- Q
- {
0 A5 z! O4 m5 x+ J6 J - case 'p':
8 U) H2 w" U0 _; i3 L( H7 `# m7 L+ I - m_p = (float) atof(optarg);
- o3 i* h3 ~3 e- k7 E. r% y+ n - case 'x':" m2 e4 Z3 C4 @1 m+ O- Q
- m_xi = optarg;' m7 E1 |( A. G0 l
- break;
( e0 p; d1 d& r: B* Y" P, i6 s' m - case 'y':
3 p# ?+ [5 @: q6 E. R& o - m_yi = optarg;. m' M! ^! b2 {
- break;; H2 Q( f% ^" V/ M2 }+ ^, {) r
- }+ z& h# ~# e6 o3 s4 n+ ]/ S8 n
- }1 j3 f( y( @; X- ~. ?
- 7 G( A+ E5 D5 J _. h" T! M% o
- res = m_lagrange_interpolating(); R! w/ Q& {3 L) O5 r
- printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);
0 B. N7 B4 ~8 Y1 w0 w - 8 L* Y; l9 d9 F) F
- return 0;- X* J9 J+ X, ~, I
- }
3 D0 f! }$ b% q- i4 X, [0 X
复制代码
作者: 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
楼主辛苦了,继续加油哈!( {# B0 W+ o" \* c! _4 C3 E% w3 Z( P8 X
作者: 1617463814 时间: 2020-4-7 18:30
谢谢分享,先下载来康康~
3 ?2 B% t" B3 f5 G3 ]3 A
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |