ilikenba 发表于 2005-3-20 11:55

[分享]插值软件langrang

<P>软件名称:EXCEL自定义插值函数插值计算数值计算
版本号: 04y09m28
分类:  工程设计应用
性质:  免费软件
使用说明:</P>
<P>    人们对EXCEL普遍熟悉的功能是表图的处理,不太知道其在工程计算(如锅炉设计计算)中的应用。复杂的工程计算常常用专业编程语言(Fortran、C、Pascal 等)来编制计算程序解决,用专业编程语言编制工程计算程序往往有下面二个缺点:

1) 编程语言专业性强,一般工程技术人员难以掌握,由这些专业编程语言编制的计算应用程序的维护、修改、升级都比较困难。</P>
<P> 2) 由专业编程语言编制的工程计算应用程序人机界面不友好,常常需要复杂的输入前、输出后处理。</P>
<P>     EXCEL每一个单元格就是一个电子表格,很容易进行一般的加、减、乘、除、乘方、开方,而三角函数、指数函数在EXCEL中可以直接引用内部函数。用EXCEL编制一般的工程计算程序还需解决的有以下两个问题:(1)循环计算,(2)表、单曲线、曲线组的查找(如:锅炉设计计算中的焓值)。对于问题(1)循环计算,EXCEL在工具菜单中提供了两个命令:单变量求解和规划求解,利用这两条命令很容易解决问题(1)。对于问题(2)表、曲线的查找,EXCEL没有提供现成的函数,但也可用VLOOKUP、MATCH、IF、OFFSET等函数的组合勉强近视解决,本文重点介绍表、曲线的查找自定义函数的定义及使用。
   
    为了更好地解决曲线查找的问题,应用C++程序设计语言,用拉格朗日插值计算法在EXCEL中建立了自定义函数,单曲线插值函数TWLQ(变量,"带路径的保存数据的文件名"),曲线组插值函数THLQ(变量1,变量2,"带路径的保存数据的文件名")。单曲线插值函数、曲线组插值函数的"带路径的保存数据的文件"包含着特定对映表、曲线的信息和计算精度的要求 (文件为Notepad编辑的txt文件) 。
单曲线lagrange插值函数:double twlq(double x,char* filename);
   double twlx(double q,char* filename);
曲线组lagrange插值函数:
   double thlq(double x,double y,char* filename);
   double thlx(double y,double q,char* filename);
   double thly(double x,double q,char* filename);。</P>
<P>例:单曲线插值函数 "带路径的保存数据的文件"结构如下:
@ Description  @
n, nsel;
x,x, x,··, x,x;
q,q, q,··, q,q;
MinX=0.7,MaxX=0.9,OverRangeAlm=1,X=电压,XUnit=mv,Q=电流,QUnit=mA</P>
<P>  注解:
     Description:用户自定义描述字符串(Description中不可有@符号);
     n:   总插值点个数;
     nsel:实际参与插值计算的插值点个数;
     MinX=0.7,MaxX=0.9 取值范围;
     OverRangeAlm=1 越限报警 1:报, 0:不报;
     X=电压,XUnit=mv,变量名称,单位。</P>
<P> ****结论:
l)图形化界面的插值函数数据文件生成器 LCZMaker 方便快捷生成单曲线或曲线组插值函数数据文件。
2)应用EXCEL自定义插值函数,在EXCEL中进行工程计算编程极为便利,比专业编程语言程序设计更易学易用、直观明了,用EXCEL编制的工程计算应用程序更易维护、修改、升级。
3) EXCEL本身长于表格制作,在EXCEL中进行工程计算编程人机界面友好,输入前、输出后处理方便简单。
4)在某大型锅炉厂电站锅炉性能设计计算中已显神力。</P>
<P>附含壁温计算,强度计算,热电偶/阻,水阻力,烟气阻力,蒸汽性质等现成数据。 </P>

ww991616 发表于 2009-10-28 15:10

:):):):victory::):):):)

ft12345 发表于 2009-11-19 14:29

:lol:lol:lol:lol好东西,谢谢斑竹

xiangzhai83 发表于 2009-11-30 10:23


/* TODO: Lagrange interpolating
*
* For example, if lg2.71 = 0.4330, lg2.72 = 0.4346, then lg2.718 = ?
* In this situation, it could be solved via lagrange interpolating
*
* */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DEBUG 0

static float m_p = 0.5635;
static char *m_xi = NULL;
static char *m_yi = NULL;
static float m_arr[] = {};
static unsigned int m_n = 0;

static void m_lagrange_interpolating_usage();
static int m_lagrange_interpolating_set_n_arr();
static float m_lagrange_interpolating();

static void
m_lagrange_interpolating_usage()
{
  printf("Lagrange Interpolating Usage:\n");
  printf("bin/li -p ** -x ** -y **\n");
  printf("-p 0.5635\n");
  printf("-x 0.56160,0.56280,0.56401,0.56521\n");
  printf("-y 0.82741,0.82659,0.82577,0.82495\n");
}

static int
m_lagrange_interpolating_set_n_arr()
{
  int xi_n = 0;
  int yi_n = 0;
  int n = 0;
  char *token = NULL;
  const char *delim = ",";

  token = strtok(m_xi, delim);
  while (token)
  {
    xi_n++;
    n++;
    m_arr = (float) atof(token);
    token = strtok(NULL, delim);
  }

  token = strtok(m_yi, delim);
  while (token)
  {
    yi_n++;
    n++;
    m_arr = (float) atof(token);
    token = strtok(NULL, delim);
  }
  
  if (xi_n != yi_n)
  {
    return 0;
  }

  m_n = xi_n = yi_n;

  return 1;
}

static float
m_lagrange_interpolating()
{
  float l = 0.00000;
  float li;
  int i;
  int j;

#if DEBUG
  printf("DEBUG at %d: enable debug mode\n", __LINE__);
  unsigned int m_n = 3;
  float m_p = 0.5635;
  float m_x[] = {0.56160, 0.56280, 0.56401, 0.56521};
  float m_y[] = {0.82741, 0.82659, 0.82577, 0.82495};
  
  for (i = 0; i < m_n; i++)
  {
    li = 1.0000000;
    for (j = 0; j < m_n; j++)
    {
      if (j != i)
      {
        li = li * (m_p - m_x) / (m_x - m_x);
      }
    }
    l = l + li * m_y;
  }
#else
  if (!m_lagrange_interpolating_set_n_arr())
  {
    printf("Error: xi and yi counter is diff\n");
   
    return 0;
  }

  for (i = 0; i < m_n; i++)
  {
    li = 1.0000000;
    for (j = 0; j < m_n; j++)
    {
      if (j != i)
      {
        li = li * (m_p - m_arr) / (m_arr - m_arr);
      }
    }
    l = l + li * m_arr;
  }
#endif

  return l;
}

int
main(int argc, char **argv)
{
  int c;
  extern char *optarg;
  float res;

  if (argc < 2)
  {
    m_lagrange_interpolating_usage();
   
    return -1;
  }

  while ((c = getopt(argc, argv, "p:x:y:")) != -1)
  {
    switch (c)
    {
      case 'p':
              m_p = (float) atof(optarg);
      case 'x':
        m_xi = optarg;
        break;
      case 'y':
        m_yi = optarg;
        break;
    }
  }

  res = m_lagrange_interpolating();
  printf("Lagrange interpolating with %.4f result is %.7f\n", m_p, res);
  
  return 0;
}

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

谢谢分享,有了这个插值就方便多了
页: [1] 2
查看完整版本: [分享]插值软件langrang