困ってます

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

困ってます

#1

投稿記事 by スウェーデン » 15年前

C++の宿題で、連立一次方程式の解を解く、というプログラムを作っています。行列にみたてているのですが、割り算ができるかどうかのチェックの入れ方がわかりません。とりあえずプログラムは以下の通りです。ちなみに、nは次数、c[/url][/url]は係数行列、b[/url]は定数ベクトル、x[/url]は回のベクトルです。
//連立方程式を解く
void linearEquations (int n,double x[/url],double c[/url][10],double b[/url]){
	int k,j,i;
	for(j=1;j<=n;j++){
		c[j][n+1]=b[j];
	}
	//前進計算(上三角化、対角要素は1)
	for(j=1;j<=n;j++){
		for(k=j+1;k<=n+1;k++){
			c[j][k]/=c[j][j];
		}
		c[j][j]=1;
		for(i=j+1;i<=n;i++){
			for(k=j+1;k<=n+1;k++){
				c[k]-=c[j]*c[j][k];
			}
			c[j]=0;
		}
	}
	//後退計算(係数行列を単位行列化)
	for(j=n;j>0;j--){
		for(i=1;i<j;i++){
			for(k=j+1;k<=n+1;k++){
				c[k]-=c[j]*c[j][k];
			}
			c[j]=0;
		}
	}
	for(j=1;j<=n;j++){
		x[j]=c[j][n+1];
	}
}

このプログラムの9行目でc[j][j]が0になった場合は、c[j]が0でないようなi行(j<i<=n)を見つけて、j行とi行を入れ替える、という操作を入れたいのですが、どのようにすればよいのでしょうか??初心者でとても申し訳ないのですが、コメントをお願いします。

たかぎ

Re:困ってます

#2

投稿記事 by たかぎ » 15年前

日本語で書いてある通りにコーディングすればよいだけだと思います。
貼っているコードが書けるだけの能力があるなら、そんなに難しいとは思いませんが...

スウェーデン

Re:困ってます

#3

投稿記事 by スウェーデン » 15年前

たかぎさんコメントありがとうございます。c[j]が0でないようなi行を見つける、というのがどういう風に表現すればいいのかがよくわからないんです・・・。教えていただけないでしょうか?

たかぎ

Re:困ってます

#4

投稿記事 by たかぎ » 15年前

for (int i = j + 1; i <= n; i++)
{
  if (c[j] != 0)
  {
    // この時点の i を記憶
    break;
  }
}

これでよいのでは?

もっとC++らしい表現を望むのであれば...
class element_of_c_is_not_zero
{
  int j_;
public:
  explicit element_of_c_is_not_zero(int j) ; j_(j) {}
  bool operator()(double* a) const { return a[j_] != 0; }
};

のようなクラスを作っておいて、
std::find_if(c + j + 1, c + n + 1, element_of_c_is_not_zero(j)) - c

とすれば、c[j] がゼロでないような i を求められると思います(テストしていないので、細部はミスがあるかも)。

スウェーデン

Re:困ってます

#5

投稿記事 by スウェーデン » 15年前

ありがとうございます。やってみます。

閉鎖

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