gsl ubuntu

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 实验数据

源码

 
  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <math.h>

  4. #include <gsl/gsl_errno.h>

  5. #include <gsl/gsl_spline.h>

  6.  
  7. #define DATA_COUNTS 19

  8. #define MAX_LINES 1024

  9.  
  10. int main()

  11. {

  12. //double curr[DATA_COUNTS] = {1,3,6,8,10,20,30,50,80,100,200,250,300,350,400,450,500,600,630,650};

  13. //double ad[DATA_COUNTS] = {1,12,18,21,25,42,60,97,154,192,384,463,544,589,644,700,736,820,832,856};

  14. double curr[DATA_COUNTS] = {0,3,6,8,10,20,30,50,80,100,200,250,300,400,450,500,600,630,650};

  15. double ad[DATA_COUNTS] = {1,2,7,11,15,30,43,72,121,155,334,419,500,650,716,778,893,924,946};

  16. double xi = 0;

  17. double yi = 0;

  18.  
  19. gsl_interp_accel *acc = gsl_interp_accel_alloc ();

  20. gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, DATA_COUNTS);

  21. gsl_spline_init (spline, ad, curr, DATA_COUNTS);

  22.  
  23. for (xi=1; xi<=ad[DATA_COUNTS-1]; xi++){

  24. yi = gsl_spline_eval (spline, xi, acc);

  25. printf("%g %g\n", xi, yi);

  26. }

  27.  
  28. gsl_spline_free (spline);

  29. gsl_interp_accel_free (acc);

  30.  
  31. return 0;

  32. }

该源码参照 gsl参考手册——三次样条插值实例程序 。

Makefile文件

 
  1. my_interp : my_interp.c

  2. gcc -Wall -g $< -L/usr/lib -lgsl -lgslcblas -lm -o $@

  3.  
  4. clean:

  5. rm -rf my_interp *~ *ps *dat

  6.  
  7. run:

  8. ./my_interp>interp.dat

  9. graph -T ps<interp.dat>interp.ps

  10.  
  11. show:

  12. 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文件命令依次执行如下:

 
  1. $ make

  2. gcc -Wall -g my_interp.c -L/usr/lib -lgsl -lgslcblas -lm -o my_interp

  3.  
  4. $ make run

  5. ./my_interp>interp.dat

  6. graph -T ps<interp.dat>interp.ps

  7.  
  8. $ make show

  9. evince interp.ps

图形效果如下:


图2 插值数据可视化

当然也可以使用gnuplot可视化数据:

 
  1. gnuplot> set term x11

  2. Terminal type set to 'x11'

  3. Options are ' nopersist'

  4.  
  5. gnuplot> set datafile separator " "

  6.  
  7. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值