ガウスの消去法を用いたN元一次方程式を解きたい

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

ガウスの消去法を用いたN元一次方程式を解きたい

#1

投稿記事 by しお » 2年前

コード:


#include<stdio.h>
#include<stdlib.h>

int main(void){
  int i,j,k,N;
  double *ai,*ak;
  double *A,*b;
  double r;
  

  printf("N=");
  scanf("%d",&N);

  ai=A;
   for(i=0;i<N;i++){
    for(j=0;j<N;j++){
      printf("A[%d][%d]=",i,j);
      scanf("%lf",&ai+j);
  }
    ai+=N;
}

for(i=0;i<N;i++){
  printf("b[%d]=",i);
  scanf("%lf",&b+i);
 }

 ai=A;
 ak=A;
 for(k=0;k<N-1;k++){
   for(i = k +1; i < N; i++){ 
     r=*(ai+i*N+k)/ *(ak+k);
     for(j=k;j<N;j++){
       *(ai+i*N+j) -= *(ak+j) * r;
     }

     b[i]-=b[k]*r;
   }
   ak+=N;
 }

 ai=ak;
 for(i =N-1; i>=0;i--){
    for(j=i+1;j<N;j++){
      b[i] -= *(ai+j)*b[j];
 }
    b[i]/=*(ai+i);
    ai-=N;

}
 for(i=0;i<N;i++){
   printf("x[%2d]=%12.8lf\n",i+1,b[i]); 

 }
 return(0);
 
}

Aの値をずっと入力し続けなければならないです…
それかコアダンプと言われるか…
解決方法を教えてください。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ガウスの消去法を用いたN元一次方程式を解きたい

#2

投稿記事 by みけCAT » 2年前

1. 値を読み込む前に、値を読み込むための領域を確保する
2. 正しい型のポインタをscanfに渡す
べきです。

1. は、

コード:

  printf("N=");
  scanf("%d",&N);
の次に

コード:

  A = malloc(sizeof(*A) * N * N);
  b = malloc(sizeof(*b) * N);
  if(A == NULL || b == NULL) return 1;
を追加することでできます。

2. は、

コード:

      scanf("%lf",&ai+j);
  scanf("%lf",&b+i);
をそれぞれ

コード:

      scanf("%lf",ai+j);
  scanf("%lf",b+i);
とすることでできます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

しお

Re: ガウスの消去法を用いたN元一次方程式を解きたい

#3

投稿記事 by しお » 2年前

返信ありがとうございます。
2.だとコアダンプでます…。
1.だとbの値を一回しか入力できないのですがどうしてでしょうか…

しお

Re: ガウスの消去法を用いたN元一次方程式を解きたい

#4

投稿記事 by しお » 2年前

返信ありがとうございます。
2.だとコアダンプでます…。
1.だとbの値を一回しか入力できないのですがどうしてでしょうか…

返信

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