想求解非线性方程组,之前使用拟牛顿法写过相关的matlab代码,这次想移植到C++代码,网上说gsl库挺好用的,于是我也想试一下。相关参考:
- 【C++】GSL(GNU Scientific Library) 的安装及在 Visual Studio 2017 中的使用
- QT5使用mingw64和mingw32编译数学库GSL
- 有没有C/C++解非线性方程组的库? - Narcissu的回答 - 知乎
- QT5环境下配置GSL数学库
配置:
我使用的是minGW7.3.0编译器(记得添加minGW的bin目录的环境变量),下载的是gsl2.5的版本,我在当前的目录使用cmd结果运行上述博客里说的:
./configure
结果报错,我检查了一下我的minGW,确实是安装了,问题出在我少装了msys,msys获取网站:
MinGW-builds,安装好以后运行msys目录下的msys.bat,cd进入到gsl 文件夹(在里面会看到configure文件),
./configure && make && make install
安装非常完美
然后把msys下面的include、lib和bin三个文件夹复制到自己的项目的目录下面,比如我这里使用的是Qt,再添加一个pri文件,把这些文件包含进来:
DEFINES += GSL_DLL
INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -llibgsl
LIBS += -L$$PWD/lib -llibgslcblas
在工程的pro里记得也把这个pri文件包含进来:
INCLUDEPATH += $$PWD/gsl/
include($$PWD/gsl/gsl.pri)
DISTFILES += gsl/gsl.pri
按上面参考4测试一下程序
#include <iostream>
#include <cmath>
#include <gsl/gsl_sf_bessel.h>
using namespace std;
int main(int argc, char *argv[])
{
double x = 10.0;
double y = gsl_sf_bessel_J0(x);
cout << "J0(" << x << ") = " << y << endl;
return 0;
}
完美
测试了一下参考3的关于gsl的代码,它提示说:
error: undefined reference to `__imp_gsl_multiroot_fsolver_hybrids
在参考2可以找到解决的方案,在include目录下找到对应的库,这里对应的明显是gsl_multiroots.h
,然后我们进去这个文件,找到gsl_multiroot_fsolver_hybrids
注释掉的是原来的语句,我们把GSL_VAR 改为extern就可以了:
//GSL_VAR const gsl_multiroot_fsolver_type * gsl_multiroot_fsolver_hybrids;
extern const gsl_multiroot_fsolver_type * gsl_multiroot_fsolver_hybrids;
然后记得clear项目然后重新构建,时间可能比较久,OK也跑起来了!
可以试着用这个库解非线性方程组了(心满意足)