検算のプログラミング

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

検算のプログラミング

#1

投稿記事 by ゆー » 15年前

はじめましてm(_ _)m

課題に困っています。
(A)(X)=(B)
まず、AとXの値を決めてBを出す。(A)(X)=(?)
次に、AとBを決めてXを出す。(A)(?)=(B)
このプログラムの作り方がわかりません。
逆行列じゃない方法で、CG法かICCG法で、A,X,Bは行列は少なくとも5x5以上であること、です。

これは、後の課題でポアソンの方程式を解くために使うみたいです。
ご指導のほど、よろしくお願いします。

下には考えた別解を載せておきます。


5次多項式の値をX=[0,_1]の6点で求める式は、[A]{X}={Y}の行列方程式になる、{X}を係数、{A]をXの乗べき項の並びとすることで、[A],{X}を準備でき、[A]{X}={B}の{B}を求めて、改めて連立方程式[A]{?}={B}から{?}を求めると{X}に等しいことをもって、検算とすることが出来る。
以下はその計算。
ここでは、最も素朴な消去法であるガウス・ジョルダン法を凝らない形で使った。
ポアソン方程式の解法に際しては、状況によっては、繰返し法の素朴な解法であるガウス・ザイデル法が適切かもらしい。


*/
#include_<stdio.h>
#include_<stdlib.h>

void_ready(double_a[6][6],double_x[6]);

int_main(){
__double__a[6][6],x[6],b[6];
__double__Akk,Aik;
__int_____i,j,k;

__//_[A],{X}を用意する
__ready(a,x);
__printf("[A],{X}_設定\n");
__printf("_[A]_-------------------------");
__printf("------------------_{X}----\n");
__for(i=0;i<6;i++)_{
____for(j=0;j<6;j++)_{
______printf("_%.5f",a[j]);
____}_printf("_%.5f\n",x);
__}
__//_{B}=[A]{X}_を計算する
__printf("{B}=[A]{X}\n");
__printf("_{B}_-------------------------");
__printf("------------------\n");
__for(i=0;i<6;i++)_{
____b_=_0;
____for(j=0;j<6;j++)_{
______b_+=_a[j]*x[j];
____}
____printf("_%.5f",b);
__}_printf("\n");
__//_検算:[A]{?}={B}_→_{?}={X}
__for(k=0;k<6;k++)_x[k]_=_b[k];
__for(k=0;k<6;k++)_{
____Akk_=_a[k][k];
____if(Akk==0)_exit(9);
____for(j=0;j<6;j++)_a[k][j]/=Akk;_x[k]/=Akk;
____for(i=0;i<6;i++)_{
______if(i==k)_continue;
______Aik_=_a[k];
______for(j=0;j<6;j++)_{
________a[j]_-=_Aik*a[k][j];
______}_x_-=_Aik*x[k];
____}
__}
__printf("[A]{?}={B}→{?}={X}検算(Gauss-Jordan)\n");
__printf("_[A]_-------------------------");
__printf("------------------_{X}----\n");
__for(i=0;i<6;i++)_{
____for(j=0;j<6;j++)_{
______printf("_%.5f",a[j]);
____}_printf("_%.5f\n",x[i]);
__}
__return_0;
}
//_[A],{x}を用意する
void_ready(double_a[6][6],double_x[6]){
__int_____i,j;
__double__v,dv;
__double__p,q;

__dv_=_1.0/5;
__q_=_1;
__for(i=0;i<6;i++)_{
____v_=_dv*i;
____p_=_1;
____for(j=0;j<6;j++)_{
______a[i][j]_=_p;
______p_*=_v;
____}
____x[i]_=_q;
____q_/=_2;
__}
}
/*_出力:
[A],{X}_設定
_[A]_-------------------------------------------_{X}----
_1.00000_0.00000_0.00000_0.00000_0.00000_0.00000_1.00000
_1.00000_0.20000_0.04000_0.00800_0.00160_0.00032_0.50000
_1.00000_0.40000_0.16000_0.06400_0.02560_0.01024_0.25000
_1.00000_0.60000_0.36000_0.21600_0.12960_0.07776_0.12500
_1.00000_0.80000_0.64000_0.51200_0.40960_0.32768_0.06250
_1.00000_1.00000_1.00000_1.00000_1.00000_1.00000_0.03125
{B}=[A]{X}
_{B}_-------------------------------------------
_1.00000_1.11111_1.24992_1.42753_1.65984_1.96875
[A]{?}={B}→{?}={X}検算(Gauss-Jordan)
_[A]_-------------------------------------------_{X}----
_1.00000_0.00000_0.00000_0.00000_0.00000_0.00000_1.00000
_0.00000_1.00000_0.00000_0.00000_0.00000_0.00000_0.50000
_0.00000_0.00000_1.00000_0.00000_0.00000_0.00000_0.25000
_0.00000_0.00000_0.00000_1.00000_0.00000_0.00000_0.12500
_0.00000_0.00000_0.00000_0.00000_1.00000_0.00000_0.06250
_0.00000_0.00000_0.00000_0.00000_0.00000_1.00000_0.03125
*/

softya

Re:検算のプログラミング

#2

投稿記事 by softya » 15年前

yahoo知恵袋で同じ質問されてますよね?
http://my.chiebukuro.yahoo.co.jp/my/mys ... sketlovers

この掲示板には、つぎのような規約がありますので守っていただきたいです。
>複数の掲示板で同じ質問をすることをマルチポストといい、大抵禁止されています。
>しかし、ここでは相互リンクし、リンク先の掲示板でマルチポストが許されていれば
>マルチポストはOKとしています。複数の掲示板で同じ質問をするときは相互リンクし、
>どこの掲示板で同じ質問をしているか明確にして下さい。

閉鎖

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