#include <stdio.h>
#include <math.h>
main()
{
/* 三元一次連立方程式の解を求めるプログラム*/
double a,b,c,d,e,f,g,h,j,k,m,n,x,y,z;
printf("input a,b,c,d,e,f,g,h,j,k,m,n:");
scanf("%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf ",&a,&b,&c,&d,&e,&f,&g,&h,&j,&k,&m,&n);
if((a*f*m+b*g*j+c*e*k-c*f*j-b*e*m-a*g*k)==0){
printf("no solutions\n");
}
else{
x=((d*f*m+b*g*n+c*h*k-c*f*n-b*h*m-d*g*k)/(a*f*m+b*g*j+c*e*k-c*f*j-b*e*m-a*g*k));
y=((a*h*m+d*g*j+c*e*n-c*h*j-d*e*m-a*g*n)/(a*f*m+b*g*j+c*e*k-c*f*j-b*e*m-a*g*k));
z=((a*f*n+b*h*j+d*e*k-d*f*j-b*e*n-a*h*k)/(a*f*m+b*g*j+c*e*k-c*f*j-b*e*m-a*g*k));
printf("x=%lf y=%lf z=%lf\n",x,y,z);
}
};
[\code]
C言語 三元一次連立方程式について
C言語 三元一次連立方程式について
初心者です。三元一次連立方程式ax+by+cz=d,ex+fy+gz=h,jx+ky+mz=n の解であるx,y,zを求めるプログラミングを作っているのですが、実際にa〜nの値を入れて計算して出た値が間違って出て来ます。どこかに間違いがあると思うのですが自分にはよくわからないので、ご指摘をいただきたいです。
Re: C言語 三元一次連立方程式について
> どこかに間違いがあると思うのですが自分にはよくわからないので、ご指摘をいただきたいです。
これは,「どこかにタイプミスがあるハズだから見つけてくれ」的な話ですよね?
そうであれば,間違いを見つけにくい要因は 見難さ にあると思うのでとりあえずそこを改善してみてはいかがでしょうか.
例えば,3*3行列の逆行列に関する資料があるとして,
その数式内の記述と,コード側の変数名とを合わせる等すれば比較しやすく,違う場所を見つけやすいのではないでしょうか.
(えっと,aが行列の左上の要素で… とかやってると確認しにくい)
また,
・行列式は1回計算したものを使い回す
・逆行列を一旦 3*3 の配列にでも格納する
等すれば,x,y,zを求める式が見やすいでしょう.
#あと,せめて「どうやって問題の解を求めるコードなのか」とか,
やってみた結果(入力に対する期待する結果と,実際に出てきた結果)くらいは書きましょうよ.
これは,「どこかにタイプミスがあるハズだから見つけてくれ」的な話ですよね?
そうであれば,間違いを見つけにくい要因は 見難さ にあると思うのでとりあえずそこを改善してみてはいかがでしょうか.
例えば,3*3行列の逆行列に関する資料があるとして,
その数式内の記述と,コード側の変数名とを合わせる等すれば比較しやすく,違う場所を見つけやすいのではないでしょうか.
(えっと,aが行列の左上の要素で… とかやってると確認しにくい)
また,
・行列式は1回計算したものを使い回す
・逆行列を一旦 3*3 の配列にでも格納する
等すれば,x,y,zを求める式が見やすいでしょう.
#あと,せめて「どうやって問題の解を求めるコードなのか」とか,
やってみた結果(入力に対する期待する結果と,実際に出てきた結果)くらいは書きましょうよ.
Re: C言語 三元一次連立方程式について
の5つの入力について計算を行い、三元連立方程式 - 高精度計算サイトで得られる解と比較を行いましたが、dragon さんが書きました:実際にa〜nの値を入れて計算して出た値が間違って出て来ます。
間違った結果は確認できませんでした。
間違った値が出てくる入力を教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語 三元一次連立方程式について
みけCATさんへ
上手くいきましたか!?自分はみけCATさんが下さった数字でやっても答えが一致しませんでした。本当に初心者で、端末での数値の入力の仕方などが間違っているのかもしれません。もしよろしかったら順を追って、詳しく説明していただきたいです。本当に無知で、正しいのか間違っているのかも分からないままやっているので、どうかよろしくお願いいたします。
上手くいきましたか!?自分はみけCATさんが下さった数字でやっても答えが一致しませんでした。本当に初心者で、端末での数値の入力の仕方などが間違っているのかもしれません。もしよろしかったら順を追って、詳しく説明していただきたいです。本当に無知で、正しいのか間違っているのかも分からないままやっているので、どうかよろしくお願いいたします。
Re: C言語 三元一次連立方程式について
謝る必要はありませんが,言ってることの内容は理解して欲しいところ.
>自分はみけCATさんが下さった数字でやっても答えが一致しませんでした
ということであれば,とりあえず何かが出力されたんですよね?
だったらその結果(と,あなたが正解だと思う値)を示さないと,他者には
本当におかしな結果が出力されているのか,それとも,あなたが「正しい答えではないと考えていることの方が間違っているのか」
の見分けが付かないと思いませんか.
入力できているのか否かが不安なのであれば,a~nの値を出力して確認してみてはいかがですか.
>自分はみけCATさんが下さった数字でやっても答えが一致しませんでした
ということであれば,とりあえず何かが出力されたんですよね?
だったらその結果(と,あなたが正解だと思う値)を示さないと,他者には
本当におかしな結果が出力されているのか,それとも,あなたが「正しい答えではないと考えていることの方が間違っているのか」
の見分けが付かないと思いませんか.
入力できているのか否かが不安なのであれば,a~nの値を出力して確認してみてはいかがですか.
Re: C言語 三元一次連立方程式について
その様子をコピペかスクリーンショットなどで見せていただけないですか?dragon さんが書きました:自分はみけCATさんが下さった数字でやっても答えが一致しませんでした。本当に初心者で、端末での数値の入力の仕方などが間違っているのかもしれません。
スクリーンショット(画像ファイル)はユーザー登録・ログインしていただいて添付ファイルを利用するか、
Imgurなどの外部サービスを利用することで貼ることができます。
なお、「答えが一致する」かではなく、桁数や丸めなどを考えて「答えが合っている」ことを確認しました。
また、dragonさんが見ているソースコードとコンパイラが見ているソースコードが一致するように注意してください。
・必ずエディタで保存した後にコンパイルをしましょう。
・保存したファイルをコンパイルしているか(別のディレクトリにある同名のファイルなどではないか)を確認しましょう。
今回の検証ではWandboxを利用しました。dragon さんが書きました:もしよろしかったら順を追って、詳しく説明していただきたいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語 三元一次連立方程式について
皆様には大変ご迷惑おかけしましたが、なんとかできるようになりました。皆様のアドバイスと指導のおかげです。諸問題解決して、答えが出るようになったので報告させていただきます。本当にありがとうございました。
Re: C言語 三元一次連立方程式について
皆様には大変ご迷惑おかけしましたが、なんとかできるようになりました。皆様のアドバイスと指導のおかげです。諸問題解決して、答えが出るようになったので報告させていただきます。本当にありがとうございました。
Re: C言語 三元一次連立方程式について
具体的に「どのようにして」解決したのか、について報告してから、解決にチェックを入れてください。dragon さんが書きました:諸問題解決して、答えが出るようになったので報告させていただきます。
また、次のアドバイスや質問にも答えてください。
- usaoさんの「やってみた結果(入力に対する期待する結果と,実際に出てきた結果)くらいは書きましょうよ.」
- みけCATさんの「間違った値が出てくる入力を教えていただけますか?」