• 締切済み

ガウスの消去法のプログラムを教えて下さい。

3x+y+z=8 6x+2y+3z=4 9x+4y+5z=12 を計算する部分ピボット選択付きのガウスの消去法と、選択のないガウスの消去法のプログラムを教えて下さい><。 何度も作り直しているのですがなかなか上手くいきません。よろしくお願いします。

みんなの回答

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

どのような処理の流れにしていますか?  ・繰り返し処理のところが、キーポイントになる感じがします。

namebo-
質問者

補足

#include<stdio.h> #include<stdlib.h> #include<math.h> int main(){ double a[3][3]={ {3,1,1}, {6,2,3}, {9,4,5} }; double b[3]={8,4,12}; double max[3]; double maxp; double temp; double x[3]; double m; int pivot=0; int i,j,k; for(k=0;k<3;k++){ for(j=k;j<3;j++){ if(maxp<fabs(a[j][k])){ pivot=j; maxp=fabs(a[j][k]); } } for(i=k;i<3;i++){ temp=a[k][i]; a[k][i]=a[pivot][i]; a[pivot][i]=temp; } temp=b[k]; b[k]=b[pivot]; b[pivot]=temp; m=a[k][k]; for(i=k;i<3;i++){ a[k][i]=a[k][i]/m; } b[k]=b[k]/m; for(j=k+1;j<3;j++){ m=a[i][k]/a[k][k]; for(i=k;i<3;i++){ a[j][i]-=a[k][i]*m; } b[j]-=b[k]*m; } for(j=2;j>=0;j--){ x[j]=b[i]; for(i=j+1;i<3;i++){ x[j]-=a[j][i]*x[i]; } } for(j=0;j<3;j++){ for(i=0;i<3;i++){ printf("%f",a[j][i]); } printf("\n"); printf("%f",x[j]); } return(0); } } というプログラムを作ったのですが上手くいきません><。

関連するQ&A

  • ガウスの消去法を用いたC言語のプログラムについて

    現在あらかじめ与えられた連立方程式をガウスの消去法を用いて、 求めるというプログラムをC言語で作っています。 しかし学校ではまだ行列のやっておらず、 ガウスの消去法についても説明があやふやでした。 一応プログラムは出来たのですが明らかに無駄が多すぎて困っています。 与えられた方程式は下記の通りです。 2x + 3y + 4z = 20 3x - 2y + 5z = 14 5x + 4y - 7z = -8 プログラムは以下の通りです。 #include <stdio.h> int main(void){ double a[3][3] = {{2, 3, 4}, //(1) {3, -2, 5}, //(2) {5, 4, -7}}; //(3) double b[3] = {20, 14, -8}; double x = 0; double y = 0; double z = 0; int i; //前進消去 //(1)÷2 ・・・(1)' for(i = 0; i < 3; i++){ a[0][i] = a[0][i] / 2; } b[0] = b[0] / 2; //(2)-(1)'×3 ・・・(2)' for(i = 0; i < 3; i++){ a[1][i] = a[1][i] - a[0][i] * 3; } b[1] = b[1] - b[0] * 3; //(3)-(1)'×5 ・・・(3)' for(i = 0; i < 3; i++){ a[2][i] = a[2][i] - a[0][i] * 5; } b[2] = b[1] - b[0] * 5; //(2)'÷6.5 ・・・(2)'' for(i = 0; i < 3; i++){ a[1][i] = a[1][i] / 6.5; } b[1] = b[1] / 6.5; //(2)''×3.5 + (3) ・・・(3)'' for(i = 0; i < 3; i++){ a[2][i] = a[2][i] + a[1][i] * 3.5; } b[2] = b[2] + b[1] * 3.5; //(3)''÷3.53846でzを求める z = b[2] / a[2][1]; //後退代入 //(2)''にzを代入してyを求める a[1][1] = a[1][1] * z; y = b[1] - a[1][1]; //(1)'にyとzを代入してxを求める a[0][1] = a[0][1] * y; a[0][2] = a[0][2] * z; x = b[0] - a[0][1] - a[0][2]; printf("\n x = %f \n y = %f \n z = %f \n", x, y, z); return 0; } 制作はvc++を用いています。 ここからどうやって短くしていけばよいかがわかりせん。 アドバイスや指摘があればお願いいたします。

  • ガウスの消去法

    次の連立方程式の解を、ガウスの消去法で出来るだけ精度よく求めたいです 0.001x+y=1 x+2y=3

  • ガウスの消去法

    はじめまして。 連立1次方程式を消去法で解くとき、 係数行列を上三角行列に変形できればどのような やり方でもよいのでしょうか?? 例えば、 x-2y+2z=2   (1) 4x-y-z=5    (2) 3x+y-7z=0   (3) これらを消去法で求めるとき(1)に-3、-4をかけて足し合わせて行けば楽なのでしょうが そうでなく、(2)、(3)にそれぞれ-1/4、-1/3をかけて足すという方法でも よいのでしょうか?? 答えは一致すると思うのですが・・・。 初歩的すぎる質問ですみませんm(__)m

  • ガウス・ジョルダン法のプログラムを教えてください!

    課題で出されたのですが、よくわからなくて困ってます… (1)ガウス・ジョルダン法のプログラムを作成せよ (2)ピボット操作つきのガウス・ジョルダン法のプログラムを作成せよ ガウス・ジョルダン法の計算の仕方はなんとなく理解できたのですが、プログラムにできなくて… わかる方よろしくお願いします><

  • ガウスの消去法

    1000変数の連立一次方程式をガウスの消去法で解いたとき、計算時間は10秒だったとする。このとき10000変数の連立一次方程式をガウスの消去法で解くのにどれぐらいの計算時間がかかるのかという疑問について、いったい何秒になるのでしょうか?オーダ(n^3/3)に10000を入れればいいのでしょうか?

  • ガウスの消去法

    次の線形代数方程式をガウスの消去方で求めたいです。 2, 4, 6   x1   28 (1, -1, 5 ) (x2 )=( 7 ) 4, 1 ,-2, x3,   21

  • このガウスの消去法を解いてください!

    2つあるのですがとけません x+2y+3z+4w=0 2x+y+3z-w=1 3x-2y+4z+3w=5 8x+2y+13z+5w=7 また -3x-3z+6w=-2 -x+y+5w=-1 5x+7z=44/9 です。 よろしくお願いします。

  • ガウス・デイデル法

    次の線形代数方程式をガウス・デイデル法で求めたいです。 x=y=z=0です 2x+4y+3z=1 x-y+5z=-3 4x+y-2z=10

  • ガウスの発散定理について

    「点(0,0,1)を中心とする半径3の半球部分(z≧1)を囲む閉曲面Sについて ∬(2x,2y,z)・dSを求めよ」という問題について質問です。 ガウスの発散定理を利用し、div(2x,2y,z)を求めるまでは判りましたが、その後の体積分の求め方が判りません。単純に上記の半球部分の体積(18π)を求めるのではありませんよね??

  • ガウスの定理を用いて解く問題です。

    この問題の解の導き方をどなたかわかりやすく教えてください。 この問題は結局何を求めているのでしょうか?球面の表面上における値というのは表面積のことを訊いているのでしょうか。途中計算までしかできませんでした。 ベクトル場A=(y-z+2x)(i)+(xy+4)(j)-xz(k) において、 球面S : x^2+y^2+z^2=4 の表面上における以下の値を求めよ。 ∫(s) A・dS *(i),(j),(k)は単位ベクトルです。 ガウスの定理より ∫(s) A・dS=∫(s) A・nds=∫(v) divA・dv *AとSはベクトルを表しています divA=∂Ax/∂x+∂Ay/∂y+∂Az/∂z =∂(y-z+2x)/∂x+∂(xy+4)/∂y+∂(-xz)/∂z =(y-z+2)+(x+4)+(-x) の形になると思うのですが、このあとの計算方法がわかりません。