https://www.jianshu.com/p/a5466682ba3d
1.安装 新立德 libgsl-dev, gsl-bin;
2. 测试 gslTest.cpp
#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>
int main (void)
{
double x = 5.0;
double y = gsl_sf_bessel_J0 (x);
printf ("J0(%g) = %.18e\n", x, y);
return 0;
}
3. 编译 链接
g++ -o testOut gslTest.cpp -lgsl -lgslcblas
./testOut
J0(5) = -1.775967713143382642e-01
编辑环境:emacs
编译环境:gcc + make
结果显示:graph + evince
graph工具需要安装plotutils包:
sudo apt-get install plotutils
evince为ubuntu自带的文档查看器
当然,你也可以在windows或Mac上使用。
场景
对单片机采样与实际电流值建立对应关系表,以理想情况论,该表应为线性关系(感应磁路+AD转换电路),但实验条件下,磁路饱和与元器件差异问题使该表并不能保持较好的线性关系,综合多方面因素,以三次样条插值来构建其对应关系比较合理。
实现
GSL主页 GSL库Interpolation模块文档 三次样条插值原理 (维基又被黑了?MLGB)
图1 实验数据
源码
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <math.h>
-
#include <gsl/gsl_errno.h>
-
#include <gsl/gsl_spline.h>
-
#define DATA_COUNTS 19
-
#define MAX_LINES 1024
-
int main()
-
{
-
//double curr[DATA_COUNTS] = {1,3,6,8,10,20,30,50,80,100,200,250,300,350,400,450,500,600,630,650};
-
//double ad[DATA_COUNTS] = {1,12,18,21,25,42,60,97,154,192,384,463,544,589,644,700,736,820,832,856};
-
double curr[DATA_COUNTS] = {0,3,6,8,10,20,30,50,80,100,200,250,300,400,450,500,600,630,650};
-
double ad[DATA_COUNTS] = {1,2,7,11,15,30,43,72,121,155,334,419,500,650,716,778,893,924,946};
-
double xi = 0;
-
double yi = 0;
-
gsl_interp_accel *acc = gsl_interp_accel_alloc ();
-
gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, DATA_COUNTS);
-
gsl_spline_init (spline, ad, curr, DATA_COUNTS);
-
for (xi=1; xi<=ad[DATA_COUNTS-1]; xi++){
-
yi = gsl_spline_eval (spline, xi, acc);
-
printf("%g %g\n", xi, yi);
-
}
-
gsl_spline_free (spline);
-
gsl_interp_accel_free (acc);
-
return 0;
-
}
该源码参照 gsl参考手册——三次样条插值实例程序 。
Makefile文件
-
my_interp : my_interp.c
-
gcc -Wall -g $< -L/usr/lib -lgsl -lgslcblas -lm -o $@
-
clean:
-
rm -rf my_interp *~ *ps *dat
-
run:
-
./my_interp>interp.dat
-
graph -T ps<interp.dat>interp.ps
-
show:
-
evince interp.ps
其中,run命令下的 “./my_interp>interp.dat”将插值后的数据重定向到文件中,便于绘图工具处理;
“graph -T ps<interp.dat >interp.ps”将intrp.dat文件的数据输入给PostScript程序并形成.ps文件;
show命令下的"evince interp.ps"使用ubuntu默认的文档察看器显示图形。
可视化
Makefile文件命令依次执行如下:
-
$ make
-
gcc -Wall -g my_interp.c -L/usr/lib -lgsl -lgslcblas -lm -o my_interp
-
$ make run
-
./my_interp>interp.dat
-
graph -T ps<interp.dat>interp.ps
-
$ make show
-
evince interp.ps
图形效果如下:
图2 插值数据可视化
当然也可以使用gnuplot可视化数据:
-
gnuplot> set term x11
-
Terminal type set to 'x11'
-
Options are ' nopersist'
-
gnuplot> set datafile separator " "
-
gnuplot> plot 'interp.dat' every::1::946 using 1:2 with lines
图示如下:
图3 插值数据可视化——gnuplot
程序源码中注释的数据,是更换了另一个磁路结构后测量到的,相应地其图形如下:
图4 另一个磁路结构实验数据可视化
从产品研发的角度来看,图2和图3对应的磁路结构比图4对应的磁路结构好得多,其优劣高下立判。
转载于:https://my.oschina.net/u/1011760/blog/471002