掲示板ランキング  ゲーム(真・女神転生)  ゲーム(水夏~SUIKA~)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6563

3元連立方程式のGauss−Jordan法について
投稿者---ぷりんG(2006/09/26 22:12:29)


Gauss-Jordan法で方程式を解くプログラムを作っているの
ですが,答が出ません。
詳しく教えてください。m(−−)m
ソースは下のとおりです。
かなり間違ってるかもしれませんがよろしくお願いします
なお使用OSはWindowsXP,bcpadで作成しました。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void swapd(double *,double *);

int main(void)
{ int i,j,k,p,N=3;
  double eps=0.0000000001,Box; /*epsは計算の許容誤差*/
  double a[3][3]={  {2,5,7},{4,13,20},{8,29,50} }; 
  double b[3]={28,53,132};
  for(i=0;i<N;i++){
    if (fabs(a[i][i]) < eps){ /*対角要素が許容誤差より小さいとき*/
      p=i; /*現在の行番号以降の項について*/
      while(++p<N){
        if(fabs(a[p][i])>eps){ /*許容誤差より大きい行が見つかれば*/
      for(j=1;j<N;j++){ /*a[]のi行とp行のi列以降を入れ替え,入れ替えにswap関数を用いる*/
        swapd(&a[i][j],&a[p][j]);
      swapd(&b[i],&b[p]);
      break;
        }
      }
      }
      if(fabs(a[i][i])<eps){ /*入れ替えが行われないとき*/
        printf("Can\'t solve !!\n"); exit(1); } /*プログラムは終了*/
        else{ 
          for (j=i+1;j<N;j++){
            a[i][j]/=a[i][i]; /*i列目以外の成分をa[i][i]でわる*/
          }
          b[i]/=a[i][i]; /*答の部分も同様にする*/
          a[i][i]=1.0; 
          for(k=0;k<N;k++){
            if(k==i) continue; 
            /*係数が1となってるi行目の式をa[k][j]倍しk行目から引く*/
            for(j=i+1;j<N;j++){
              a[k][j]-=a[i][j]*a[k][j];
            }
            b[k]-=b[i]*a[k][i];
            a[k][i]=0.0;
                      }
        }
    }

  }
  for(i=0;i<N;i++)
  printf("%f\n",b[i]);
  return 0;
}
void swapd(double *c,double *d){
  double temp; 
  temp=*c;
  *c=*d;
  *d=temp;
  return;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:3元連立方程式のGauss−Jordan法について 6564 かずま 2006/09/27 02:31:32


No.6564

Re:3元連立方程式のGauss−Jordan法について
投稿者---かずま(2006/09/27 02:31:32)


まずは、シンプルなプログラムを書いてみて、
そのあとに、対角要素が 0 になる場合の交換処理を入れるとよいのでは?
また、デバッグ用の print関数を用意するなどして、値の変化を見てみましょう。
#include <stdio.h>

#define N  3

void print(double a[N][N], double b[N]);

int main(void)
{
    int i, j, k;
    double a[N][N] = {
        { 2,  5,  7 },   /* 2x +  5y +  7z =  28 */
        { 4, 13, 20 },   /* 4x + 13y + 20z =  53 */
        { 8, 29, 50 },   /* 8x + 29y + 50z = 132 */
    };
    double b[N] = { 28, 53, 132 };

    print(a, b);
    for (i = 0; i < N; i++) {
        for (j = i + 1; j < N; j++)
            a[i][j] /= a[i][i];
        b[i] /= a[i][i];
        a[i][i] = 1;
        for (k = 0; k < N; k++) {
            if (k == i) continue;
            for (j = i + 1; j < N; j++)
                a[k][j] -= a[i][j] * a[k][i];
            b[k] -= b[i] * a[k][i];
            a[k][i] = 0;
        }
        print(a, b);
    }
    for (i = 0; i < N; i++)
        printf("%8.3f\n", b[i]);
    return 0;
}

void print(double a[N][N], double b[N])
{
    int i, j;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf("%8.3f", a[i][j]);
        printf("  %8.3f\n", b[i]);
    }
    puts("---");
}



この投稿にコメントする

削除パスワード

No.6565

Re:3元連立方程式のGauss−Jordan法について
投稿者---ぷりんG(2006/09/27 20:37:13)


やっと答が出力できました。
アドバイスありがとうございますm(−−)m


この投稿にコメントする

削除パスワード

No.6567

Re:3元連立方程式のGauss−Jordan法について
投稿者---かずま(2006/09/27 23:44:44)


> やっと答が出力できました。

まだ解決されていません。
対角要素が許容誤差より小さいときの処理はどうしましたか?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ