計算するプログラムを別の表現で表したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
carnage0216
記事: 20
登録日時: 6年前

計算するプログラムを別の表現で表したい

#1

投稿記事 by carnage0216 » 5年前

以下のプログラム

コード:

*********************************************

 * 連立方程式の解法 ( ガウスの消去法 )

 *********************************************/

#include <iostream> // for cout

#include <stdio.h> // for printf()



// 元の数定義

#define N 4 // 3



using namespace std;



/*

 * 計算クラス

 */

class Calc

{

 double a[N][N + 1];



 // 各種変数

 double d; // ダミー

 int i, j, k; // LOOP インデックス



 public:

 // 連立方程式を解く(ガウスの消去法)

 void calcGaussElimination();

};



/*

 * 連立方程式を解く(ガウスの消去法)

 */

void Calc::calcGaussElimination()

{

 // 係数

 static double a[N][N + 1] = {

 //{ 2.0, -3.0, 1.0, 5.0},

 //{ 1.0, 1.0, -1.0, 2.0},

 //{ 3.0, 5.0, -7.0, 0.0}

 { 1.0, -2.0, 3.0, -4.0, 5.0},

 {-2.0, 5.0, 8.0, -3.0, 9.0},

 { 5.0, 4.0, 7.0, 1.0, -1.0},

 { 9.0, 7.0, 3.0, 5.0, 4.0}

 };



 // 元の連立方程式をコンソール出力

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

 for (j = 0; j < N; j++)

 printf("%+fx%d ", a[i][j], j + 1);

 printf("= %+f\n", a[i][N]);

 }



 // 前進消去

 for (k = 0; k < N -1; k++) {

 for (i = k + 1; i < N; i++) {

 d = a[i][k] / a[k][k];

 for (j = k + 1; j <= N; j++)

 a[i][j] -= a[k][j] * d;

 }

 }



 // 後退代入

 for (i = N - 1; i >= 0; i--) {

 d = a[i][N];

 for (j = i + 1; j < N; j++)

 d -= a[i][j] * a[j][N];

 a[i][N] = d / a[i][i];

 }



 // 結果出力

 for (k = 0; k < N; k++)

 printf("x%d = %f\n", k + 1, a[k][N]);

}



/*

 * メイン処理

 */

int main()

{

 try

 {

 // 計算クラスインスタンス化

 Calc objCalc;



 // 連立方程式を解く(ガウスの消去法)

 objCalc.calcGaussElimination();

 }

 catch (...) {

 cout << "例外発生!" << endl;

 return -1;

 }



 // 正常終了

 return 0;

} 
を載せさせて頂いたプログラムのように配列ではなく、方程式の形a *x1*x1 + b * x1 + c == 32のまま、for文などの繰り返しなし、scanfで座標を入力し、n次方程式を解くプログラムを作れるでしょうか?

コード:

#include <stdio.h>







int main(void) {



 a *x1*x1 + b * x1 + c == 32;//(1)

 d *x2*x2 + e * x2 + f == 40;//(2)

 g *x3*x3 + h * x3 + i == 35;//(3)





 d*x2*x2 - (a*x1*x1*(d*x2*x2 /a*x1*x1)) + e*x2 - (b*x1*(a*x2*x2 /d* x1*x1)) - f - (c*(a*x2*x2 /d*x1*x1));



 printf("%d", d*x2*x2 - (a*x1*x1*(d*x2*x2 /a*x1*x1)) + e*x2 - (b*x1*(a*x2*x2 /d*x1*x1)) - f - (c*(a*x2*x2 /d*x1*x1)));



 return 0;

}

box
記事: 2002
登録日時: 13年前

Re: 計算するプログラムを別の表現で表したい

#2

投稿記事 by box » 5年前

方程式の形a *x1*x1 + b * x1 + c == 32のまま、for文などの繰り返しなし、scanfで座標を入力し、n次方程式を解くプログラムを作れるでしょうか?
4次方程式までならば解の公式がありますので、座標(じゃなくて係数ですよね?)を
入力すれば配列もfor文も使わずに解が求まります。
5次以上の方程式には解の公式がありません。この場合、Newton法などを使う必要がありますが、
繰り返しの処理が必要ですので、質問者さんの要求を満たしません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 計算するプログラムを別の表現で表したい

#3

投稿記事 by usao » 5年前

この人,他所でも同様の話を延々とやってるけど,何か得るものがあったんでしょうかね?
「方程式」を,CやC++ではこの人のコードみたく(a *x1*x1 + b * x1 + c == 32 とかいう形で)書くことができないから
配列を使うことで表現する,そのことが何でそんなに気に入らないのか理解できないのですよね.
(係数群を配列に格納したとして,そのコード内においてはそのデータが「方程式」として扱われるなら,何の不自由もないと思うのだが.)

そして今度は繰り返しアルゴリズムも嫌だと.

> Newton法など
の数値計算アルゴリズムを実装する際には,一般に,iteration回数に制限をかけられるように作るでしょうから
最大回数固定でよいならまぁ気が済むまでループを手動で展開して書き下せばどうですかね?

返信

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