数学建模社区-数学中国
标题: [分享]插值软件langrang [打印本页]
作者: ilikenba 时间: 2005-3-20 11:55
标题: [分享]插值软件langrang
软件名称:EXCEL自定义插值函数插值计算数值计算
- g+ h" I8 m9 C# @# r( }9 g* H! x; E版本号: 04y09m28
6 W! I6 @3 |) w2 I/ C7 \0 o分类: 工程设计应用: q I3 v2 o% g3 @# b# v: s6 F
性质: 免费软件
/ v( }$ L) ?- K5 r# P9 h6 |2 Q使用说明:
" N* S0 c/ T8 r3 u
人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点:
! F- [6 G" F* Q , c4 s" h' q- t9 n6 O: I6 n+ j
1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。
% i9 o1 ~3 X; w% J) b
2) 由专业编程语言编制的工程计算应用程序人机界面不友好,常常需要复杂的输入前、输出后处理。
8 k8 E Y$ b7 y+ N" E) A6 ?1 Y
EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。
; {. C$ i4 |: k# @$ w+ {( a) s $ j, M+ x0 ~& P$ r# r% V
为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。
0 z, }, s) D2 q9 n. d1 g单曲线lagrange插值函数:double twlq(double x,char* filename);+ M1 y% V3 |( C# F
double twlx(double q,char* filename);
5 f( S9 {5 K% @8 ]/ I3 d! P m曲线组lagrange插值函数:& L# Y9 O3 J+ H9 W5 o8 l
double thlq(double x,double y,char* filename);1 {: w. E/ M0 g+ H
double thlx(double y,double q,char* filename);; {. b8 G7 M- D; M' D: c
double thly(double x,double q,char* filename);。
) O* J- }, l$ L4 i: K* j. {例:单曲线插值函数 "带路径的保存数据的文件"结构如下:& E; d" ~, o1 F1 x+ [% i
@ Description @" V. z: F8 m5 h
n, nsel;6 J8 X& J& ?- q, H+ ~7 w
x[0],x[1], x[2],··, x[n-2],x[n-1];
6 K/ j6 M$ Y5 G+ B/ lq[0],q[1], q[2],··, q[n-2],q[n-1];- Z* X6 V( I8 o m$ z: ~0 R
MinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA
9 C) m2 D8 s. E$ [7 m" V' }
注解:
: ^ a9 ]3 O. W* h* `# \9 i Description:用户自定义描述字符串(Description中不可有@符号);
# o/ A' C& U" m. m# s% ]8 O n: 总插值点个数;6 K- L" a+ l1 N( u. [
nsel:实际参与插值计算的插值点个数;
; y/ I% l5 f/ Q MinX=0.7,MaxX=0.9 取值范围;
0 J& d' k1 [# }3 B OverRangeAlm=1 越限报警 1:报, 0:不报;
" N" t! F, Y @ t X=电压,XUnit=mv,变量名称,单位。
, P8 |0 J5 n# E3 N4 S ****结论:
: |0 m, l* O0 K/ A9 Z, O. U l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。
' j" V, U' b" u8 m( m 2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。
# S7 G. G" {( s! S; V! h 3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。
7 O! ^+ Z6 {+ W9 n8 \ 4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。
- a' m, J, o1 i0 ]6 S5 ^% ]附含壁温计算,强度计算,热电偶/阻,水阻力,烟气阻力,蒸汽性质等现成数据。
% k: L/ V% v* |2 w# B V
[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
- ! N. W& [( z, ~) F* `. c a
- /* TODO: Lagrange interpolating
% r [' W a7 F% _7 x! X - *) W/ w3 _3 x, p& ~& [& B
- * For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?
/ I1 |$ ?8 X9 d: K; l2 ^ - * In this situation, it could be solved via lagrange interpolating) `/ a/ x, ?8 P5 [- y
- *
. [1 A8 r) G- g - * */; F: n2 E) L& ?& i2 T( n
- ^8 G! l& Y3 N5 a- #include <stdio.h>
& o; x( N1 _& g - #include <stdlib.h>
3 T9 m% k7 G: T" B - #include <string.h>
9 c) U# {8 b! ?0 o - - P- F0 ^; |, S. V( j2 s2 I
- #define DEBUG 06 [4 D. L$ _, y5 C7 t
1 b! S& Q5 ^5 S0 q- static float m_p = 0.5635;
% ~6 H9 ~) s5 a& \: o9 t6 j6 H7 p - static char *m_xi = NULL;
U j( o i7 @6 e( U) I8 a% k - static char *m_yi = NULL;
/ i/ O& J* ?8 L# k% e. d c - static float m_arr[] = {};
' k& W7 n5 W6 G6 ?4 U" ]7 D - static unsigned int m_n = 0;* ~( \5 @. V9 F5 T0 [
3 ^" g- z, V) ?5 y s4 G- static void m_lagrange_interpolating_usage();' X: F% @2 q. x; |
- static int m_lagrange_interpolating_set_n_arr();
$ [) r( J' y9 k& f% \% y - static float m_lagrange_interpolating();
3 H, t' z: h, E. w* _
6 ^$ m" K$ h7 o7 v& f- static void 8 G; \, D( D: U, U( P# \, d
- m_lagrange_interpolating_usage()
. c* l C# W: _; Q% _3 c+ T - {& ^$ e" R7 d5 M7 F1 e) n
- printf("Lagrange Interpolating Usage:\n");
2 |% d+ c" D; c/ ? - printf("bin/li -p ** -x ** -y **\n");* K# ^5 d. N/ t
- printf("-p 0.5635\n");
$ `$ S6 E$ H0 I& u - printf("-x 0.56160,0.56280,0.56401,0.56521\n");
* H; v7 Z, O5 `7 w3 i* I5 u% o9 |, S - printf("-y 0.82741,0.82659,0.82577,0.82495\n");, L. h& t# ^- O, ?
- }& T6 f; f$ C- U4 m! W$ M
- # O, [- h% E. U1 L$ P
- static int
$ U- [5 Z8 O% L - m_lagrange_interpolating_set_n_arr() # W- j; \+ p/ s3 T2 J6 d
- {. c3 q3 ?; A- B h7 y0 Z- [
- int xi_n = 0;, W6 {( y1 G' U# q7 @( Q0 A, G
- int yi_n = 0;
$ E0 r. A8 r5 k# T# _. { - int n = 0;
0 G. T. E2 ~9 R* P S0 X ^- v ^) V - char *token = NULL;7 Z, k k. t8 S9 { D3 k: w* u
- const char *delim = ",";; `/ K( O$ j0 B1 |5 @/ G9 |$ n: {% M
- ' _3 z" R% q1 U, C& |6 J- v
- token = strtok(m_xi, delim);
) \: I1 P5 @% Z( k: g - while (token)
/ f, i% S9 u+ E) {- J5 Q - {
: g& G) a' h$ \! Z$ F - xi_n++;% [. I: N! D% {; Q$ i% u) s
- n++;
% {5 A/ r t0 G1 T2 r% [7 ? - m_arr[n] = (float) atof(token);! @/ F" K2 }0 Q# }( X# o. L+ v
- token = strtok(NULL, delim);
; `- [6 m2 `; w" v! i6 Q6 |% N* a - }
' L% d; B& w8 O1 i* M - : C% k6 ^5 v1 A/ r4 [2 w
- token = strtok(m_yi, delim); V' o5 V' ?6 W& r
- while (token)1 R( `( u3 I# C0 i, i3 M3 w k1 K/ @
- {: i3 F+ ^8 u4 c! f& {: }) `0 D, J
- yi_n++;! V# q1 |* V9 a0 t
- n++;
5 t3 h2 x/ i+ H4 `# _; o - m_arr[n] = (float) atof(token);
8 k; |! r) _6 h# d7 q0 q7 Q - token = strtok(NULL, delim);0 t! ~8 f6 w+ D5 t8 d- t: J9 m
- }
9 k \2 s4 L; _: M - 4 _& v( d5 P8 N" K) J
- if (xi_n != yi_n) 2 x. M# A2 a6 u' s/ { t0 H
- {: u* x% W! d9 O0 ]8 _5 U% x
- return 0;
( B+ p0 Y1 M7 u* a - }6 L" Z! }) F; C$ u
4 p: L- }- |2 t* f; `2 y$ E- m_n = xi_n = yi_n;
3 b, d& c5 M1 b! s8 h - 9 r) m% x* l' ~. |
- return 1;
9 `9 E7 B% `) a: M: e3 N$ Z; z! c* O/ _ - }1 W/ _8 Q; u( p1 V
- 3 ^4 t; C" T$ m/ _+ b+ T
- static float & y& F0 B( P$ B% \: n) [+ `
- m_lagrange_interpolating()
, Y6 e! L& `$ J4 | - {
5 {) G- v8 G, ~4 D/ N - float l = 0.00000;
5 t# a: @5 h3 F1 b+ L) e - float li;8 E1 @% V q# ]3 G% f4 G
- int i;9 u3 W) E/ N- Y p
- int j;
+ f* s" l% B; H" T: a$ C
$ J) d% N( o6 i8 ~. p- p! x- #if DEBUG
V/ _6 m% o, K3 c - printf("DEBUG at %d: enable debug mode\n", __LINE__);
" I) l4 m) s/ g7 \ Q/ q - unsigned int m_n = 3;
% |# r2 I( x y2 N& M2 | - float m_p = 0.5635;( Q! [1 r5 U M( |
- float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
3 i o3 o* T$ Q& H/ o- I* I( L - float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};1 Q4 J8 s8 w" l; j1 L) p X9 ]
-
. s, A1 S" x9 o* g1 e - for (i = 0; i < m_n; i++)
4 z% Z7 a9 j2 Y( G' z1 O8 y% T - {
( q- E$ m2 @* Z H; c- S - li = 1.0000000;2 t) `& \* n- Y$ e
- for (j = 0; j < m_n; j++)
8 x, o _. |% J; L/ E" n - {' G7 s7 [6 ]8 g6 {4 M7 ?" L
- if (j != i). o: [# q6 q6 G% Q! J1 b
- {
! q" ]0 R$ z* B4 S" S* o - li = li * (m_p - m_x[j]) / (m_x[i] - m_x[j]);6 m. \5 P% K. D0 z' \
- }" S$ C, c7 V/ B/ `! }
- } ~) }8 i- h+ [+ l# J% M. R
- l = l + li * m_y[i];5 C5 W/ g) B( e: E
- }/ t# m4 e# q1 I- ]; Q/ I
- #else
% M* k9 A: s# v6 W2 @+ ?/ M - if (!m_lagrange_interpolating_set_n_arr()) 8 H& @) R7 r7 @" |
- {
: d( c# z" w6 h: n0 k - printf("Error: xi and yi counter is diff\n");
8 j3 _ V: o. k& k. [: p - & s6 H! H3 [) w4 Z# A
- return 0;
$ E" V- {/ Q! z; {0 B1 H& N - }/ D. m1 P A' x; O. d) k
- % ^9 g& i; @' `7 N5 W5 m4 h+ C
- for (i = 0; i < m_n; i++) 9 ~( j Z0 t/ e0 \- }/ D
- {
' V, ]% }7 u0 |# E+ s$ c7 a& E - li = 1.0000000;
, Y8 {. a: F( S$ S" @. M) e5 B# X: z - for (j = 0; j < m_n; j++) 1 \7 W9 E4 n+ e5 n+ m# e9 Q
- {
) Q5 k# Z3 E. e% c/ @( u- c - if (j != i)
% T% t( ~* H9 v- s - {# d" o. l) S9 ~+ u {' R, N
- li = li * (m_p - m_arr[j + 1]) / (m_arr[i + 1] - m_arr[j + 1]);
8 V" w7 S7 C9 |# b' u+ X+ {1 P. y. F - }
. k% D& ~ b+ F+ H9 S, C! n - }$ H& g+ r: b* R& n' k8 C
- l = l + li * m_arr[i + m_n + 1];
+ V5 Z& k7 |$ e5 X& } - }6 c+ S4 U9 h$ U4 D5 H M. M# T
- #endif
) _( m9 L3 X) R$ f+ v; D - 6 L: u f A4 [7 E/ h2 {) p" D
- return l;& A2 L- p+ j( n. s7 O/ u6 `& \9 I
- }
) y, _$ D. h& x: O; X0 { - 7 k( k- ]/ P8 F2 ~, C
- int
" B# H& `) @ R; B8 Q3 h% g+ {' c+ T - main(int argc, char **argv)
. `7 M; I; O( o2 E. K0 r - {3 J: `. F( ]/ v7 D5 r6 c+ i+ G! o- f
- int c;
0 E" [' H5 [$ x* {6 B7 | - extern char *optarg;: |- T" n1 j- w2 s& e$ y
- float res;1 \/ w$ d3 g7 v) ^; [
, b/ l5 }2 ]6 ?' T- if (argc < 2)
+ p4 H% U5 J- x* U7 w+ f - {% ?% |! p9 N8 W& {( e, ]9 E+ Q
- m_lagrange_interpolating_usage();" ?, ~9 p. l/ `0 w* p! ^& V
- 7 S3 D4 m: Q+ d3 e8 d N' D
- return -1;( A/ ~6 \0 o8 P3 P* p3 l. W. Y6 t
- }8 f) l( Z- d6 i7 I4 y2 q. p
9 O- E5 d7 w s6 c' {8 D- while ((c = getopt(argc, argv, "p:x:y:")) != -1)
: O) j, C( T' v$ { - {
: K1 q9 _ H: G- W6 M; T - switch (c)
$ |! p+ X3 w) `! r - {2 z! S6 C6 ~& @$ H5 k" E/ W) C# B& N
- case 'p':: U" V+ P) ^/ O' a
- m_p = (float) atof(optarg);
/ M8 G; p. T* w8 ^% C+ p" K! D - case 'x':* ]" Z+ ^5 a0 g* }' h+ [& W
- m_xi = optarg;3 T! B3 A. ^7 L9 d. {+ |: t. C2 v8 o# }
- break;
4 l, X7 L) i2 ~9 I* C1 _ - case 'y':( b" w& R2 w9 }; [9 J5 }5 |
- m_yi = optarg;
. v# I% v/ H9 Z0 V+ s9 ~. B - break;
. X* D" e% V- x: ]( ^, i, I1 C - }8 t$ F) V0 s$ [+ L, F+ ]) E
- }' k4 {' c+ u, N. e
1 m$ f) B1 D4 j& R- res = m_lagrange_interpolating();
: }7 T. q% Y5 y - printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);) I# i/ Q' Q' R' z9 n
- ; Y, D. Y) @1 `+ D
- return 0;
* m8 `1 n& z1 M - }
) I6 v5 g7 o7 R9 ]; 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
楼主辛苦了,继续加油哈!
6 k5 G( T0 U$ ]& q- h8 i5 X6 z
作者: 1617463814 时间: 2020-4-7 18:30
谢谢分享,先下载来康康~
) I$ e `8 F: n7 {1 ~- _% O, n7 m
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |