CLAPACKを利用した連立一次方程式

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kikori

CLAPACKを利用した連立一次方程式

#1

投稿記事 by kikori » 14年前

CLAPACKを用いて行列の連立方程式を解いているのですが,Bus errorが出てしまい,動きません.ソースはCLAPACKのライブラリとリンクさせてコンパイルしています.ちなみに,コンパイル時には,オブジェクト型ファイルを生成した後,次のように gcc exa.c lapack_LINUX.a blas_LINUX.a libf2c.a tmglib_LINUX.a -lmとコマンドを打った後, ls -Fを打っています.以下にソース示しますので原因分かる方おられましたら,教えてください.



#include<stdio.h>
#include<math.h>

main()
{
int i;
int n=3, nrhs=1, info, ipiv[n];
double A[n*n];
double x[n];

A[0]=2.; A[1]=1.; A[2]=3.;
A[3]=1.; A[4]=3.; A[5]=2.;
A[6]=3.; A[7]=2.; A[8]=1.;
x[0]=13.; x[1]=13.; x[2]=10.;

printf("N=%d\n",n);

dgesv_(&n,&nrhs,A,&n,ipiv,x,&n,&info);

for(i=0;i<n;++i){
printf("%lf\n",x);
}
}

アバター
うしお
記事: 56
登録日時: 14年前

Re: CLAPACKを利用した連立一次方程式

#2

投稿記事 by うしお » 14年前

CLAPACKは知りませんが、
double x[n];のように、変数を配列の宣言に使うことは出来ません。
const int n = 10;などのように定数である必要があります。
ご確認ください

kikori

Re: CLAPACKを利用した連立一次方程式

#3

投稿記事 by kikori » 14年前

>うしおさん

回答有り難うございます.
参考までにCLAPACKで連立一次方程式をとくサイトがあったので,掲示させていただきます.
http://homepage3.nifty.com/~yonishi/Pro ... index.html

宣言の表記的には,CLAPACKを使うので,問題ないかと思います.
自分自身まだCLAPACKについてはよくわかってないのですが,CLAPACKの表記に準じたプログラムを書き,それをCLAPACKに渡して計算している感じです.

アバター
うしお
記事: 56
登録日時: 14年前

Re: CLAPACKを利用した連立一次方程式

#4

投稿記事 by うしお » 14年前

うーむそれでないとすると、残念ながら答えられません
printfはdoubleでもfloatでも lfではなくfがただしいようです。
(これが原因ではないかと思いますが・・・)
お力になれず、すみません

アバター
コスモ
記事: 3
登録日時: 14年前
連絡を取る:

Re: CLAPACKを利用した連立一次方程式

#5

投稿記事 by コスモ » 14年前

>CLAPACKを用いて行列の連立方程式を解いているのですが,Bus errorが出てしまい,動きません.ソースはCLAPACKのライブラリとリンクさせてコンパイルしています.

とあるのでこちらのUbuntu10.10 32bit(gcc 4.4.5)の環境で
$ sudo apt-get install libblas-dev liblapack-dev libatlas-base-dev
と必要なパッケージを導入してからコンパイルしてみました。
まず、kikoriさんのコンパイル方法でコンパイルをしようとすると、
-------------------------------
gcc: lapack_LINUX.a: そのようなファイルやディレクトリはありません
gcc: blas_LINUX.a: そのようなファイルやディレクトリはありません
gcc: libf2c.a: そのようなファイルやディレクトリはありません
gcc: tmglib_LINUX.a: そのようなファイルやディレクトリはありません
-------------------------------
と出てコンパイルが上手くいきませんでした…

こちらで調べた方法では、
$ gcc -o exa exa.c -llapack -lblas
としてコンパイルしてやるとdgesv_関数がきちんと値を出してくれました。
--------------------
N=3
1.000000
2.000000
3.000000
--------------------
また、kikoriさんの提示されているソース

コード:

double x[n];
のように配列の要素数が変数としてなっていると、
MSVC(WindowsのVC++コンパイラ)ではコンパイルできない為ポータビリティが無くなるので注意しておきます。
gccではコンパイルできます。

kikori

Re: CLAPACKを利用した連立一次方程式

#6

投稿記事 by kikori » 14年前

>うしおさん

いえいえ,ありがとうございました

>cosmoさん

回答有り難うございます.
自分の環境でgcc -o exa exa.c -llapack -lblas を行うと,
cannot find -llapack
と出たので,コマンドオプションが登録されていない??ようです.
ちなみにCLAPACKのインストールはCLAPACK-3.1.1.1をインストールしております.

アバター
コスモ
記事: 3
登録日時: 14年前
連絡を取る:

Re: CLAPACKを利用した連立一次方程式

#7

投稿記事 by コスモ » 14年前

kikori さんが書きました: 自分の環境でgcc -o exa exa.c -llapack -lblas を行うと,
cannot find -llapack
と出たので,コマンドオプションが登録されていない??ようです.
ちなみにCLAPACKのインストールはCLAPACK-3.1.1.1をインストールしております.
細かいバージョンがこちらと違っていたみたいですね・・・。
こちらはapt-getで入手出来たパッケージをそのままインストールしてしまったので、
CLAPACKのバージョンは3.2.1-8でした。
バージョンにより上手く動いていないことも考えられます。
バージョンを上げてみたらどうなるでしょうか。

また、CLAPACKはLinuxのディストリビューションにより、
・debパッケージ(Debian/Ubuntu etc.)や
・rpmパッケージ(RedHat/CentOS etc.)
が提供されていることもあるのでそちらのインストールを試みてみるのもいいと思います。
こちらの方法のほうが安全です。

追記ですが、kikoriさんの使われているLinuxのディストリビューションは何でしょうか。
一応ですが、静的ライブラリファイルにLINUXとあるので気になりました。

また、他のC言語のソースでも同様にBus Errorが出るのでしょうか。
このエラーはどうやらメモリが足りない事や、ライブラリが破損している時に出るエラーなようです。

kikori

Re: CLAPACKを利用した連立一次方程式

#8

投稿記事 by kikori » 14年前

>cosmoさん

ご丁寧にありがとうございます.
OSはFreeBSDを使っています.
一応計算機は学校にある研究用のスーパーコンピュータ使っているので,メモリ不足はないと思います.
あと,最新バージョンはインストールが上手くいかず,その関係でちょっと古いバージョンをインストールしました.

閉鎖

“C言語何でも質問掲示板” へ戻る