アプリ版:「スタンプのみでお礼する」機能のリリースについて

連立方程式を解くプログラムを多元線形連立方程式にするには。


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

#define N 3

int main(void) {

clock_t start, end;
start = clock();


float a[N][N+1] = {
{5,-1,-1,0},
{ 2,1,-3,-5 },
{ 1,1,1 ,6} }; // The matrix

//前進消去
int i;

float d = a[1][0] / a[0][0];


for (i = 0; i <= 3; i++) {//forを使う上で上限がなかったので3までが上限なのでi<=3と書いた。
a[1][i] = a[1][i] - a[0][i] * d;
{
printf("a[1][%d]=%fとなる\n", i,a[1][i]);
}



}


float r;
r = a[2][0] / a[0][0];
for (i = 0; i <= 3; i++) {
a[2][i] = a[2][i] - a[0][i] * r;
}
int I;
for (I = 0; I <= 3; I++) {
printf("a[2][%d]=%fとなる\n", I,a[2][I]);
}

float z;
z= a[2][1] / a[1][1];
int y; //iは1から3まで入るのでkに+1した形で入ってもらいiを利用する。kはforより3までとする。
for (y = 0; y <= 3; y++) {
a[2][y] = a[2][y] - a[1][y] * z;
printf("a[2][%d]=%fとなる\n", y, a[2][y]);
}
//前進消去終わり
//後退代入
float g = a[2][3] / a[2][2];
printf("Z=%f\n", g);

float h;
h = a[1][3] / a[1][1] - a[1][2] / a[1][1]* a[2][3] / a[2][2];
printf("Y=%f\n", h);

float j;
j = h / a[0][0] + g / a[0][0];
printf("X=%f\n", j);
end = clock();
printf("%f sec\n", (double)(end - start) / CLOCKS_PER_SEC);

return 0;
}
//後退代入終わり
以上のプログラムを多元線形連立方程式にできないでしょうか?
どうかよろしくお願いいたします。
またできるならば多元線形連立方程式のプログラムにできるのならばその過程も教えていただけるとありがたいです。

A 回答 (7件)

あ"〜〜〜。

・・・・う〜〜ん・・・・・・。
多分「やりたい事」が何なのか、うっすらと想像は出来るんですが・・・・。

単純には「できません」って言っておくべきですかねぇ。
あるいは「できる」としても「メチャクチャメンド臭い」んで、今の貴方には出来ない、あるいは「ツールが悪い」って言い方になるかもしれません。

基本的にはプログラミング言語は「電卓」です。
つまり、例えば、「多元線形連立方程式」なんぞ持ち出さなくても、

int x = 1;
printf("%d\n", 2*x);

なんつーのは解けます。xに「代入」して「結果を出す」、なんて電卓的に出来るのが通常のプログラミング言語なんですよ。
ところが、例えば

2*x + 1 = 3

みたいな「方程式」を与えて、上のように「xに何かを代入する」のではなくって、「xの値を自動的に出しなさい」となると、途端に通常のプログラミング言語では「お手上げ」になるのです。
100円ショップで売ってるような電卓と同じですね。「電卓では実は方程式は扱えない」。

実は「方程式を解かせるプログラム」と言うのは過去研究されていました。その割にはその成果を目にする事は少ないです。それほどプログラムに「方程式を解かせる」ってのは難しいのです。
平たく言うと、貴方が提示したプログラムのように、「数値を与えて計算させる」んではなくって、「文字列(あるいはそれに類する何か)を与えて操作する」と言うのが方針になります。
貴方が提示したようなプログラムの形式を「数値計算」と言いますが、反面、「文字列(等)を操作して」計算させるのを「記号計算」と呼びます。全くジャンルが違うのです。
単純に言うと、

char str[] = "2*x + 1 = 3";

みたいにして「文字列を弄って行って」計算していくわけですが、そうなると文字列のパーズ(構文解析)をどうするのか、とかそのテのシチメンドクサイ話が出てくるんですね。しかもC/C++辺りだと文字列操作関数が「貧弱」過ぎて、全部実装するとなるとシャレにならなくなるでしょう。
従って、現時点では「諦めなさい」と言うか、あるいは「別のプログラミング言語でやった方が良い」としか言いようが無くなっちゃうんですよね。

多分こういうプログラムを「完成形」として想像してるんだとは思うんですが。

Maxima:
http://maxima.sourceforge.net/
    • good
    • 0
この回答へのお礼

解答ありがとうございます。
あの、もしかしたら私の勘違いかも知れないのですが、
多元線形連立方程式って4次元とか6次式を処理すると思うのですが、
ガウスの消去法で調べるとNを変えれば何次式でも解けるようなのですが、これはどうなのでしょうか?https://www.mk-mode.com/octopress/2013/09/24/cpp …

お礼日時:2018/07/29 02:23

> ガウスの消去法で調べるとNを変えれば何次式でも解けるようなのですが、これはどうなのでしょうか?



「何次式」じゃなくって「何元でも」じゃないですか?
そうだとすればその通りです。

ソースコードに付いてはC++は知らないのでなんとも言えないですが、例えばNを入力する形にして、任意の連立方程式を入力、拡張する、ってのは十分可能なのではないでしょうか。
かつ、そのソースでも「連立方程式に直す」と言うのは、結局、配列内の数値を文字列にはめ込んで並べるだけ、になっていますね。
    • good
    • 0
この回答へのお礼

何次元にするかで
プログラムに5次元の式を計算する場合、forループで限界が来たりしないのでしょうか?
100次元でも計算できるのでしょうか?

お礼日時:2018/07/29 08:39

ガウスの消去法で「何元でも」解けるというのは (いろいろ突っ込みたいところはあるが) まあその通りなんですけどねぇ>#2.



ただ, そうするとこの一連の話のふりだしに戻っちゃうわけで. なんというか, 「あがり」の直前に 6マス続けて「ふりだしに戻る」があるようなすごろく?
    • good
    • 1
この回答へのお礼

色々突っ込みたいところはあるがに関して聞きたいですね。是非。

お礼日時:2018/07/29 10:08

> 100次元でも計算できるのでしょうか?



100元連立方程式でも理論上は可能ですね。
どっちにせよ、多重ループするにしてもたかだか2〜3重、しかも一つのループでせいぜい100回です。フツーの計算でループさせても100回なんて大した数じゃないです。
(モンテカルロ法なんかのプログラムでは10,000回ループを回す、なんつーのもザラです)
だから、「言語規格上は」ループに上限なんかはありません。

仮に「限界」があるとすれば、言語上のループの問題じゃなくって、メモリが足りなくなる、とかあるいは大きな数になって一つのメモリブロックに置ける数の上限超えてしまう、なんつーことはあるかもしれませんが、少なくとも最近のPCだとメモリ容量自体は16GB(これは実はかなりデカい)もある、とかザラなんでフツーに計算する上では容量的には大した障害にならないでしょうねぇ。
    • good
    • 0
この回答へのお礼

なるほど、ではメモリ以外で解けないとしたらどんな式?なら間違えるんですかね?

お礼日時:2018/07/29 10:08

>100次元でも計算できるのでしょうか?



行列を保持するのに必要なメモリ量は
n x (n+1) x 8 byte =800,800
つまり、たったの800 kbyteです。

計算量は、浮動小数点の掛け算と足し算併せて70万回くらい。
#かけ算回数=足し算回数≒(1/3)n^3
現在、普通の市販のパソコンが 100 GFLOPS をこえる
ところまで来てるのて、処理時間は 10 μs のオーダー

n=1000でも100回くらい計算をくり返さないと計算時間を
体感できません(^-^;
    • good
    • 0
この回答へのお礼

ど、どうもありがとうございました。

お礼日時:2018/07/29 10:13

> なるほど、ではメモリ以外で解けないとしたらどんな式?なら間違えるんですかね?



間違える?
いや、間違えないでしょう。間違えるのは常に人間の方です。
正確に言うと、CPU設計時にミスをしたり、プログラミング言語の実装時にミスをする、とかあって、「機械が間違える」ように見える、って事はあるでしょうけどね。それにしても突き詰めると「人為的ミス」です。
    • good
    • 0

>n x (n+1) x 8 byte =800,800


>つまり、たったの800 kbyteです。
間違えた 80,800byte≒81 kbyteですね。
n=1000でも 8 Mbyte
今時のパソコンなら余裕です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!