前提・実現したいこと
ガウスの消去法により連立方程式の解を求める。
c言語でガウスの消去法を実装しようと以下のようなコードを作成したのですが、すべての値をscanfで読み取ったあとにsegmentation faultが出てしまいうまくどうさしません。どこを直せば正常に機能するのか教えていただきたいです。
該当のソースコード
#include <stdio.h>
#include <stdlib.h>
void PrintAb(double *A, double *b, int n)
{
int i, j;
double *ai;
printf("A,b=\n");
for(i = 0;i < n; i++)
{
for(j = 0;j < n; j++)
{
printf("%6.1f\t", *(ai+j));
}
printf("|%6.1f\t", b[i]);
ai += n;
}
printf("\n");
}
int main(void)
{
int i, j, k, N;
double r;
double *ai, *ak;
double *A, b;
printf("N=");
scanf("%d", &N);
A = (double ) malloc(NNsizeof(double));
if(A == NULL)
{
printf("Can't allocate memory.\n");
exit(1);
}
b = (double ) malloc(Nsizeof(double));
if(b == NULL)
{
printf("Can't allocate memory.\n");
exit(1);
}
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);
}
PrintAb(A, b, N);
ai = A;
ak = A;
for(k = 0;k < N-1;k++)
{
for(i = k+1; i < N; i++)
{
r = (ai+iN+k) / *(ak+k);
for(j = k;j < N; j++)
{
(ai+iN+j) -= *(ak+j) * r;
}
b[i] -= b[k] * r;
}
PrintAb(A, b, N);
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);
PrintAb(A, b, N);
ai -= N;
}
return 0;
}
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー