#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での反復関数 */
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に解がないとして戻る */
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");
}
このプログラムの???のところがよくわかりません.教えてください.
スズキさんが何を求めているのかわかりませんが,答えだけを求めるのならお帰りください.ここはレポートの答えを教えてくれる場所ではありません.一緒に考え議論するところです.
プログラムコードに付いて聞かれたいのでしたら,jacobi法の説明をしていただかないと,話は先に進みません.
# 九州ポリテクカレッジの学生さんかな? # ここは先生も見てるかもしれませんよ.