C言語 三元一次連立方程式について

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

C言語 三元一次連立方程式について

#1

投稿記事 by dragon » 8年前

初心者です。三元一次連立方程式ax+by+cz=d,ex+fy+gz=h,jx+ky+mz=n の解であるx,y,zを求めるプログラミングを作っているのですが、実際にa〜nの値を入れて計算して出た値が間違って出て来ます。どこかに間違いがあると思うのですが自分にはよくわからないので、ご指摘をいただきたいです。

コード:

#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]

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: C言語 三元一次連立方程式について

#2

投稿記事 by usao » 8年前

> どこかに間違いがあると思うのですが自分にはよくわからないので、ご指摘をいただきたいです。

これは,「どこかにタイプミスがあるハズだから見つけてくれ」的な話ですよね?
そうであれば,間違いを見つけにくい要因は 見難さ にあると思うのでとりあえずそこを改善してみてはいかがでしょうか.

例えば,3*3行列の逆行列に関する資料があるとして,
その数式内の記述と,コード側の変数名とを合わせる等すれば比較しやすく,違う場所を見つけやすいのではないでしょうか.
(えっと,aが行列の左上の要素で… とかやってると確認しにくい)

また,
・行列式は1回計算したものを使い回す
・逆行列を一旦 3*3 の配列にでも格納する
等すれば,x,y,zを求める式が見やすいでしょう.


#あと,せめて「どうやって問題の解を求めるコードなのか」とか,
 やってみた結果(入力に対する期待する結果と,実際に出てきた結果)くらいは書きましょうよ.

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語 三元一次連立方程式について

#3

投稿記事 by みけCAT » 8年前

dragon さんが書きました:実際にa〜nの値を入れて計算して出た値が間違って出て来ます。

コード:

1 2 3 4 5 6 7 8 9 10 15 20

コード:

1 1 1 1 1 2 3 4 4 3 2 1

コード:

1 3 3 1 1 2 3 4 4 3 2 1

コード:

9 4 0 1 4 5 1 9 4 6 0 1

コード:

1 0 0 2 0 1 0 3 0 0 1 4
の5つの入力について計算を行い、三元連立方程式 - 高精度計算サイトで得られる解と比較を行いましたが、
間違った結果は確認できませんでした。

間違った値が出てくる入力を教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

dragon

Re: C言語 三元一次連立方程式について

#4

投稿記事 by dragon » 8年前

usaoさん
至らないところが多く、申し訳ありませんでした。

dragon

Re: C言語 三元一次連立方程式について

#5

投稿記事 by dragon » 8年前

みけCATさんへ

上手くいきましたか!?自分はみけCATさんが下さった数字でやっても答えが一致しませんでした。本当に初心者で、端末での数値の入力の仕方などが間違っているのかもしれません。もしよろしかったら順を追って、詳しく説明していただきたいです。本当に無知で、正しいのか間違っているのかも分からないままやっているので、どうかよろしくお願いいたします。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: C言語 三元一次連立方程式について

#6

投稿記事 by usao » 8年前

謝る必要はありませんが,言ってることの内容は理解して欲しいところ.

>自分はみけCATさんが下さった数字でやっても答えが一致しませんでした

ということであれば,とりあえず何かが出力されたんですよね?
だったらその結果(と,あなたが正解だと思う値)を示さないと,他者には
本当におかしな結果が出力されているのか,それとも,あなたが「正しい答えではないと考えていることの方が間違っているのか」
の見分けが付かないと思いませんか.


入力できているのか否かが不安なのであれば,a~nの値を出力して確認してみてはいかがですか.

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語 三元一次連立方程式について

#7

投稿記事 by みけCAT » 8年前

dragon さんが書きました:自分はみけCATさんが下さった数字でやっても答えが一致しませんでした。本当に初心者で、端末での数値の入力の仕方などが間違っているのかもしれません。
その様子をコピペかスクリーンショットなどで見せていただけないですか?
スクリーンショット(画像ファイル)はユーザー登録・ログインしていただいて添付ファイルを利用するか、
Imgurなどの外部サービスを利用することで貼ることができます。
なお、「答えが一致する」かではなく、桁数や丸めなどを考えて「答えが合っている」ことを確認しました。

また、dragonさんが見ているソースコードとコンパイラが見ているソースコードが一致するように注意してください。
・必ずエディタで保存した後にコンパイルをしましょう。
・保存したファイルをコンパイルしているか(別のディレクトリにある同名のファイルなどではないか)を確認しましょう。
dragon さんが書きました:もしよろしかったら順を追って、詳しく説明していただきたいです。
今回の検証ではWandboxを利用しました。
wandbox-usage-20170621.png
Wandboxの使用法
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

dragon

Re: C言語 三元一次連立方程式について

#8

投稿記事 by dragon » 8年前

皆様には大変ご迷惑おかけしましたが、なんとかできるようになりました。皆様のアドバイスと指導のおかげです。諸問題解決して、答えが出るようになったので報告させていただきます。本当にありがとうございました。

dragon

Re: C言語 三元一次連立方程式について

#9

投稿記事 by dragon » 8年前

皆様には大変ご迷惑おかけしましたが、なんとかできるようになりました。皆様のアドバイスと指導のおかげです。諸問題解決して、答えが出るようになったので報告させていただきます。本当にありがとうございました。

かずま

Re: C言語 三元一次連立方程式について

#10

投稿記事 by かずま » 8年前

dragon さんが書きました:諸問題解決して、答えが出るようになったので報告させていただきます。
具体的に「どのようにして」解決したのか、について報告してから、解決にチェックを入れてください。

また、次のアドバイスや質問にも答えてください。
  • usaoさんの「やってみた結果(入力に対する期待する結果と,実際に出てきた結果)くらいは書きましょうよ.」
  • みけCATさんの「間違った値が出てくる入力を教えていただけますか?」

返信

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