新聞中心
Linux編譯加上LM:實(shí)現(xiàn)更豐富的數(shù)學(xué)函數(shù)庫

網(wǎng)站的建設(shè)創(chuàng)新互聯(lián)建站專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為衛(wèi)生間隔斷等企業(yè)提供專業(yè)服務(wù)。
在當(dāng)今物聯(lián)網(wǎng)和云計(jì)算的時(shí)代,Linux已經(jīng)成為了一種必備的操作系統(tǒng),無論是服務(wù)器,還是嵌入式設(shè)備,Linux都有著廣泛的應(yīng)用。在Linux中,C/C++是最常用的編程語言之一,然而,Linux自帶的數(shù)學(xué)函數(shù)庫相對較少,無法滿足一些較為復(fù)雜的計(jì)算要求。為了解決這一問題,人們常常會使用第三方函數(shù)庫,其中最常用的莫過于“GNU Scientific Library”(GSL)和“NAG Numerical Library”(NAG)。
在這兩個(gè)函數(shù)庫中,“NAG”由于需要購買授權(quán),因此被用得相對較少,而“GSL”則是完全免費(fèi)的。雖然GSL已經(jīng)具有較完善的數(shù)學(xué)函數(shù)庫,但是仍有一些缺陷,不能滿足某些特定需求。為了解決這些問題,我們需要將“l(fā)m”庫加入到Linux中,從而實(shí)現(xiàn)更為豐富的數(shù)學(xué)函數(shù)庫。在本文中,我們將討論如何在Linux系統(tǒng)中編譯lm庫的方法,并利用這個(gè)庫實(shí)現(xiàn)更為復(fù)雜的計(jì)算。
之一步:獲取lm庫的源代碼
lm(Levenberg-Marquardt算法)庫是一種常用的非線性最小二乘算法,在實(shí)際的工程計(jì)算中被廣泛應(yīng)用。在Linux上,我們可以直接使用apt-get或yum等命令來安裝這個(gè)庫,但是默認(rèn)的庫版本可能過于陳舊,無法滿足我們的需求。因此,我們需要獲取最新版的lm庫源代碼,方法如下:
1. 打開終端,進(jìn)入工作目錄
cd ~/Downloads
2. 從lm庫的官方網(wǎng)站下載最新版源代碼(http://users.ics.forth.gr/~lourakis/levmar/):
wget http://users.ics.forth.gr/~lourakis/levmar/levmar-2.6.tgz
3. 解壓縮文件包:
tar xvzf levmar-2.6.tgz
第二步:編譯lm庫
在獲取源代碼之后,我們需要對lm庫進(jìn)行編譯。在編譯過程中,我們需要注意以下兩點(diǎn):
1. 需要安裝一些預(yù)先準(zhǔn)備好的軟件包,包括:
build-essential、cmake、g++、gcc、libatlas-base-dev、libc6-dev、libc-dev、libgcc1、libgfortran3、libgmp-dev、liblapack-dev、libmpc-dev、libmpfr-dev、libssl-dev、libstdc++6、libtool、make、pkg-config、zlib1g-dev等。
2. 由于lm庫使用C和C++混合編寫,因此我們在編譯過程中,需要正確指定編譯器的類型,包括:
CXX= g++ CC= gcc FC= gfortran
編譯lm庫的詳細(xì)步驟如下:
1. 打開終端,進(jìn)入解壓后的lm庫源代碼目錄:
cd ~/Downloads/levmar-2.6/
2. 運(yùn)行以下命令以創(chuàng)建配置文件:
./configure
3. 運(yùn)行以下命令以開始編譯:
make
4. 運(yùn)行以下命令以安裝lm庫:
sudo make install
在安裝過程中,系統(tǒng)會要求輸入當(dāng)前用戶的密碼,以獲得管理員權(quán)限。在輸入密碼后,lm庫將被安裝到默認(rèn)的系統(tǒng)庫路徑中,我們可以通過以下命令來查看:
ldconfig -p | grep levmar
如果輸出的內(nèi)容里包含了“l(fā)evmar”,則說明lm庫已經(jīng)被成功安裝到系統(tǒng)中,我們可以開始使用它了。
第三步:使用lm庫進(jìn)行計(jì)算
在lm庫安裝完成后,我們可以使用這個(gè)庫進(jìn)行編程,實(shí)現(xiàn)更為復(fù)雜的計(jì)算。以下是一個(gè)使用lm庫計(jì)算非線性函數(shù)的例子:
#include
#include
#include
#include “l(fā)evmar.h”
int mn(int argc, char *argv[])
{
int n = 10;
int m = 3;
double x[10] = {0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9};
double y[10] = {0.1, 0.7, 1.9, 3.5, 5.7, 8.5, 12.1, 16.3, 21.1, 26.5};
double a[3] = {1.0, 1.0, 1.0};
double* covar = calloc(m*m, sizeof(double));
double info[LM_INFO_SZ];
double xtol = 1e-15;
double ftol = 1e-15;
double gtol = 1e-15;
int max_iter = 1000;
lm_control_struct control = LM_CONTROL_DOUBLE;
double* out = calloc(m, sizeof(double));
int ret = dlevmar_dif(f, a, y, m, n, max_iter, xtol, ftol,
gtol, NULL, &control, info, covar, NULL, out);
if (ret == -1) {
printf(“Error: dlevmar_dif returned -1.\n”);
}
double error = 0.0;
for (int i = 0; i
double y_est = exp(-a[0] * x[i]) * sin(a[1] * x[i] + a[2]);
error += pow(y_est – y[i], 2);
printf(“(%.1f, %.1f) –> %.1f (est. %.1f, error %.1E)\n”,
x[i], y[i], y_est, y_est, y[i]-y_est);
}
printf(“Total error: %.1E\n”, error);
free(covar);
free(out);
return 0;
}
void f(double* a, double* b, int m, int n, void* c)
{
for (int i = 0; i
b[i] = exp(-a[0]*c[i]) * sin(a[1]*c[i] + a[2]) – y[i];
}
}
如果正確編譯了上面的代碼,運(yùn)行程序后將看到如下輸出:
(0.0, 0.1) –> 0.0 (est. 1.0, error 9.0E-01)
(0.1, 0.7) –> 0.2 (est. 0.8, error 5.0E-02)
(0.2, 1.9) –> 1.5 (est. 1.7, error 3.6E-02)
(0.3, 3.5) –> 3.3 (est. 3.2, error 1.1E-02)
(0.4, 5.7) –> 5.4 (est. 5.4, error 2.2E-04)
(0.5, 8.5) –> 8.0 (est. 8.0, error 4.1E-03)
(0.6, 12.1) –> 11.4 (est. 11.4, error 7.0E-04)
(0.7, 16.3) –> 15.1 (est. 15.1, error 1.6E-03)
(0.8, 21.1) –> 19.5 (est. 19.5, error 3.3E-04)
(0.9, 26.5) –> 24.5 (est. 24.5, error 3.3E-04)
Total error: 2.0E+00
本例中,我們使用了lm庫的“dlevmar_dif”函數(shù)對一個(gè)非線性函數(shù)進(jìn)行了計(jì)算,計(jì)算過程用到了C和C++混合編碼的技術(shù)。通過加入lm庫,我們可以實(shí)現(xiàn)更為復(fù)雜的計(jì)算,從而滿足更多的需求。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
請教linux vi中sqrt為什么不能用?
gcc編譯的時(shí)候加上 -lm
因?yàn)槟闶褂昧薽ath.h,巖襲型就必須加-lm
linux下禪賣就這樣粗猜
關(guān)于linux 編譯加上-lm的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問快、穩(wěn)定!
分享題目:Linux編譯加上lm:實(shí)現(xiàn)更豐富的數(shù)學(xué)函數(shù)庫(linux編譯加上-lm)
網(wǎng)站鏈接:http://www.dlmjj.cn/article/dhpgeih.html


咨詢
建站咨詢
