jacobi法のプログラム

jacobi法のプログラム

スズキ さんの書込 (2008/07/09(Wed) 14:06)

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

#define N 10 /* 配列の次数 / #define N1 11 / N+1 / #define EPSILON 1.0E-3 / 収束の判定 (誤差の和) / #define TRUE 1 / 収束した / #define FALSE 0 / 解がない / #define KMAX 100 / 最大反復数 */

float a[N][N1]; /* 拡大行列 / int sw, n, n1; / sw:1=解がある , n:連立方程式の元数, n1:拡大行列の列数 / int k; / 繰り返し回数 / float x[N]; / 近似解 */

void input(char DataTitle); / 連立方程式の元数nと拡大行列a[n][n+1]の読み込み / void outputn1(char *DataTitle, char *mtitle); / 拡大行列(n×n+1)の表示関数 / void jacobi(char *DataTitle, int *sw); / 拡大行列のJacobiでの反復関数 / void outputvn(char *DataTitle, char *vtitle); / 近似解x[i]の表示関数 / void matunit(void); / 主軸を1とする拡大行列への変換関数 */

int main() {

int i,j; char DataTitle[50]; char pa; / pa:日付用文字列(ポインタ変数)/ long nowtime;

time(&nowtime); pa = ctime(&nowtime); (pa+24)='0'; printf("<%s>n", pa); / 実行年月日などをコマンドプロンプトに表示する. */

printf("E03i.c Jacobi法による連立一次方程式の解 kpc 関谷n"); input(DataTitle); /* 連立方程式の元数nと拡大行列a[n][n+1]の読み込み / outputn1(DataTitle, "n ==== 入力した拡大行列 ===="); matunit(); / 主軸を1とする拡大行列への変換関数を呼ぶ */ outputn1(DataTitle, "n = 主軸を1とした拡大行列 =");

jacobi(DataTitle, &sw); /* 拡大行列のJacobiでの反復関数 */

if(sw==TRUE){ /* 解があったなら,解を表示する */
outputvn(DataTitle, "n== Jacobiの反復による連立方程式の解 ==n");/* 解x[i]の表示関数 */
} else {
printf("n 解は求まりませんでした! n");

void outputvn(char DataTitle, char *vtitle) / 解(n)の表示関数 */ {

int i;

printf("<%s> %s", DataTitle, vtitle); for(i=0; i<n; i++) {

printf("?????????????????????????");

} printf("n");

void matunit(void) /* 主軸を1とする関数 */ {

int i, j; float aii;

for(i=0; i<n; i++) {

aii = a[i][i]; for(j=0; j<n1; j++) {

a[i][j] /= aii;

}

void swap( float wk1, float *wk2) / 2つの変数の入れ替え関数 */ {

float w; w= *wk1; *wk1= *wk2; *wk2=w;

void jacobi(char DataTitle, int *sw) / 拡大行列のjacobi法による反復関数 */ { int i, j, ik; // 2001.5.18kを削除した.outputvn()でkを参照したい

float x0[N], Nk, xx, xdif;

for(i=0; i<n; i++) x[i]=0.0; /* x[i] を0.0で初期化する */

for(k=1; k<=KMAX; k++){ /* 反復のループ */

Nk = 0.0; for(i=0;i<n; i++) x0[i] = x[i]; /* 前の近似値に代入 */ for(j=0; j<n; j++){

????????????? /* {}内の計算−定数項のセットしたい / ??????????????????????????????????????????????? / k回の近似値の計算ループにしたい */ x[j] = xx; xdif = x[j]-x0[j]; Nk += fabs(xdif);

} printf("反復%2d回 Nk:%7.4f ", k, Nk); outputvn("", "近似解"); /* 近似解の表示関数 */ if(Nk < EPSILON) break;

} if(k==KMAX)

sw = FALSE; / *swに解がないとして戻る */
else
sw = TRUE; / *swに解があるとして戻る */

void input(char DataTitle) / 連立方程式の元数nと拡大行列a[n][n+1]の読み込み */ {

int i,j;

scanf("%s", DataTitle); /* データのタイトル / scanf("%d", &n); / 連立方程式の元数n / n1=n+1; / 列数n1=n+1(拡大行列) */ for(i=0; i<n; i++)

for(j=0; j<n1; j++)
scanf("%f", &a[i][j]);

void outputn1(char DataTitle, char *mtitle)/ 拡大行列(n×n+1)の表示関数 */ {

int i, j;

printf("<%s> %sn", DataTitle, mtitle); /* タイトルの表示 */

printf("行列"); /* 列の見出し1 / for(j=0; j<n1; j++) { / 列の見出しのループ */

printf(" %3d ", j); if (j == (n-1)) printf("|");

} printf("n");

for(i=0; i<n; i++) { /* 行のループ */

printf(" %d : ", i); for(j=0; j<n1; j++) { /* 列のループ */

printf(" %6.2f ", a[i][j]); if (j == (n-1)) printf("|");

} printf("n");

} printf("n");

このプログラムの???のところがよくわかりません.教えてください.

Re: jacobi法のプログラム

toorisugari no Hiro さんのレス (2008/07/09(Wed) 14:21)

スズキさんが何を求めているのかわかりませんが,答えだけを求めるのならお帰りください.ここはレポートの答えを教えてくれる場所ではありません.一緒に考え議論するところです.

プログラムコードに付いて聞かれたいのでしたら,jacobi法の説明をしていただかないと,話は先に進みません.

# 九州ポリテクカレッジの学生さんかな? # ここは先生も見てるかもしれませんよ.