質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Q&A

解決済

1回答

228閲覧

C言語 ループがうまく回らない

ka_70040

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

0グッド

0クリップ

投稿2024/04/27 08:19

編集2024/04/27 08:56

ビールの製造では、以下の工程で麦汁が作られます。
C6H12O6(グルコース) -> 2 CH3CH2OH(エタノール) + 2 CO2
ただし、生成されるのはエタノールだけではなく、ジアセチルや酢酸エチルなども生成されます。
今、エタノール濃度をC_eth, ジアセチル濃度をC_dia, 酢酸エチル濃度をC_aceとして、発酵時間と温度によって何がどれだけ生成するかを知りたいです。C_ethができるだけ多く、その他はできるだけ少なくすることが目標です。初期濃度は全て0です。
そこで、
ある温度Tで、初期値エタノール濃度C_eth = 0, 製造時間t = 0の時、C_ethが50を超えたらループを抜けて、その時の時間を出力したいです。T=286291(l = 05で回しています)(整数)の全ての値で時間が出力されるようにしたいです。

  • T=286, 287, ,,,291のfor文のループがうまく回るようにしたい。

###前提

ルンゲ・クッタ法で6元の連立微分方程式を解いています。for 文とdo-while文を使って、初期条件を変えた時の値を比較したいです。微分方程式自体は問題ないのですが、forのループがうまく回りません。
具体的には、1回目は回るのですが、2回目以降、1回でdo-whileのループを出てきてしまっているようです。初心者ですがご教授願います。

発生している問題・エラーメッセージ

l=0のみ正しい値がでる。
l=1~5では全てt = 0.001となってしまう。

該当のソースコード

int main(){  //初期値を入力 X_lag0 = 2.40; X_act0 = 0.100; C_sug0 = 160; C_eth0 = 0; C_eth = C_eth0; X_lag = X_lag0; X_act = X_act0; C_sug = C_sug0; alpha = 0.200; k_dc = 0.000128; k_dm = 0.0012; t_r[0] = t; n_C[0] = C_eth0; //T1[0] = 290; //do while文// for(l = 0; l <= 5; ++l){ t = 0; dt = 0.001; k = 0; do{ T = l + 286;     //反応速度定数などを設定 k_lag = exp(30.7 - 9.50 * 1000 / T); k_x0 = exp(108 - 31900 / T); k_m = exp(130 - 38300 / T); k_sug0 = exp(-41.9 + 11700 / T); sigma_sug = exp(-120 + 34200 / T); k_eth0 = exp(3.27 - 1270 / T); gamma_ace = exp(89.9 - 27600 / T); X_lag_old = X_lag; X_act_old = X_act; C_sug_old = C_sug; C_eth_old = C_eth; C_ace_old = C_ace; C_dia_old = C_dia; k_x = k_x0 * C_sug / (0.5 * C_sug0 + C_eth); k_sug = k_sug0 * C_sug / (sigma_sug + C_sug); k_eth = (1 - C_eth / 0.5 / C_sug0) * k_eth0 * C_sug / (sigma_sug + C_sug); //ルンゲクッタ法, 読み飛ばしてください// k1 = f1(t, X_lag_old, X_act_old, C_sug_old, C_eth_old, C_ace_old, C_dia_old); k2 = f1(t + 0.5 * dt, X_lag_old + 0.5 * k1 * dt, X_act_old + 0.5 * l1 * dt, C_sug_old + 0.5 * m1 * dt, C_eth_old + 0.5 * n1 * dt, C_ace_old + 0.5 * o1 * dt, C_dia_old + 0.5 * p1 * dt); k3 = f1(t + 0.5 * dt, X_lag_old + 0.5 * k2 * dt, X_act_old + 0.5 * l2 * dt, C_sug_old + 0.5 * m2 * dt, C_eth_old + 0.5 * n2 * dt, C_ace_old + 0.5 * o2 * dt, C_dia_old + 0.5 * p2 * dt); k4 = f1(t + dt, X_lag_old + k3 * dt, X_act_old + l3 * dt, C_sug_old + m3 * dt, C_eth_old + n3 * dt, C_ace_old + o3 * dt, C_dia_old + p3 * dt); X_lag += (k1 + 2.0 * k2 + 2.0 * k3 + k4) * dt / 6.0; l1 = f2(t, X_lag_old, X_act_old, C_sug_old, C_eth_old, C_ace_old, C_dia_old); l2 = f2(t + 0.5 * dt, X_lag_old + 0.5 * k1 * dt, X_act_old + 0.5 * l1 * dt, C_sug_old + 0.5 * m1 * dt, C_eth_old + 0.5 * n1 * dt, C_ace_old + 0.5 * o1 * dt, C_dia_old + 0.5 * p1 * dt); l3 = f2(t + 0.5 * dt, X_lag_old + 0.5 * k2 * dt, X_act_old + 0.5 * l2 * dt, C_sug_old + 0.5 * m2 * dt, C_eth_old + 0.5 * n2 * dt, C_ace_old + 0.5 * o2 * dt, C_dia_old + 0.5 * p2 * dt); l4 = f2(t + dt, X_lag_old + k3 * dt, X_act_old + l3 * dt, C_sug_old + m3 * dt, C_eth_old + n3 * dt, C_ace_old + o3 * dt, C_dia_old + p3 * dt); X_act += (l1 + 2.0 * l2 + 2.0 * l3 + l4) * dt / 6.0; m1 = f3(t, X_lag_old, X_act_old, C_sug_old, C_eth_old, C_ace_old, C_dia_old); m2 = f3(t + 0.5 * dt, X_lag_old + 0.5 * k1 * dt, X_act_old + 0.5 * l1 * dt, C_sug_old + 0.5 * m1 * dt, C_eth_old + 0.5 * n1 * dt, C_ace_old + 0.5 * o1 * dt, C_dia_old + 0.5 * p1 * dt); m3 = f3(t + 0.5 * dt, X_lag_old + 0.5 * k2 * dt, X_act_old + 0.5 * l2 * dt, C_sug_old + 0.5 * m2 * dt, C_eth_old + 0.5 * n2 * dt, C_ace_old + 0.5 * o2 * dt, C_dia_old + 0.5 * p2 * dt); m4 = f3(t + dt, X_lag_old + k3 * dt, X_act_old + l3 * dt, C_sug_old + m3 * dt, C_eth_old + n3 * dt, C_ace_old + o3 * dt, C_dia_old + p3 * dt); C_sug += (m1 + 2.0 * m2 + 2.0 * m3 + m4) * dt / 6.0; n1 = f4(t, X_lag_old, X_act_old, C_sug_old, C_eth_old, C_ace_old, C_dia_old); n2 = f4(t + 0.5 * dt, X_lag_old + 0.5 * k1 * dt, X_act_old + 0.5 * l1 * dt, C_sug_old + 0.5 * m1 * dt, C_eth_old + 0.5 * n1 * dt, C_ace_old + 0.5 * o1 * dt, C_dia_old + 0.5 * p1 * dt); n3 = f4(t + 0.5 * dt, X_lag_old + 0.5 * k2 * dt, X_act_old + 0.5 * l2 * dt, C_sug_old + 0.5 * m2 * dt, C_eth_old + 0.5 * n2 * dt, C_ace_old + 0.5 * o2 * dt, C_dia_old + 0.5 * p2 * dt); n4 = f4(t + dt, X_lag_old + k3 * dt, X_act_old + l3 * dt, C_sug_old + m3 * dt, C_eth_old + n3 * dt, C_ace_old + o3 * dt, C_dia_old + p3 * dt); C_eth += (n1 + 2.0 * n2 + 2.0 * n3 + n4) * dt / 6.0; o1 = f5(t, X_lag_old, X_act_old, C_sug_old, C_eth_old, C_ace_old, C_dia_old); o2 = f5(t + 0.5 * dt, X_lag_old + 0.5 * k1 * dt, X_act_old + 0.5 * l1 * dt, C_sug_old + 0.5 * m1 * dt, C_eth_old + 0.5 * n1 * dt, C_ace_old + 0.5 * o1 * dt, C_dia_old + 0.5 * p1 * dt); o3 = f5(t + 0.5 * dt, X_lag_old + 0.5 * k2 * dt, X_act_old + 0.5 * l2 * dt, C_sug_old + 0.5 * m2 * dt, C_eth_old + 0.5 * n2 * dt, C_ace_old + 0.5 * o2 * dt, C_dia_old + 0.5 * p2 * dt); o4 = f5(t + dt, X_lag_old + k3 * dt, X_act_old + l3 * dt, C_sug_old + m3 * dt, C_eth_old + n3 * dt, C_ace_old + o3 * dt, C_dia_old + p3 * dt); C_ace += (o1 + 2.0 * o2 + 2.0 * o3 + o4) * dt / 6.0; p1 = f6(t, X_lag_old, X_act_old, C_sug_old, C_eth_old, C_ace_old, C_dia_old); p2 = f6(t + 0.5 * dt, X_lag_old + 0.5 * k1 * dt, X_act_old + 0.5 * l1 * dt, C_sug_old + 0.5 * m1 * dt, C_eth_old + 0.5 * n1 * dt, C_ace_old + 0.5 * o1 * dt, C_dia_old + 0.5 * p1 * dt); p3 = f6(t + 0.5 * dt, X_lag_old + 0.5 * k2 * dt, X_act_old + 0.5 * l2 * dt, C_sug_old + 0.5 * m2 * dt, C_eth_old + 0.5 * n2 * dt, C_ace_old + 0.5 * o2 * dt, C_dia_old + 0.5 * p2 * dt); p4 = f6(t + dt, X_lag_old + k3 * dt, X_act_old + l3 * dt, C_sug_old + m3 * dt, C_eth_old + n3 * dt, C_ace_old + o3 * dt, C_dia_old + p3 * dt); C_dia += (p1 + 2.0 * p2 + 2.0 * p3 + p4) * dt / 6.0;     //ここまでルンゲ・クッタ法、読み飛ばしてください t += dt; k += 1; }while(C_eth <= 50); t_final1[l] = t; C_dia_final[l] = C_dia; //}while(C_eth <= 50); } for(x = 0; x<=5; ++x){ printf("%f,%f\n", t_final1[x], C_dia_final[x]); } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

長くなってしまったので、最初の文字設定のところなどは飛ばしてあります。本当に初心者で、質問の仕方もあっているかわかりません。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki-o

2024/04/27 08:41 編集

いろいろ省略しすぎですが、C_eth = 0はどこで定義していますか? C_ethは1回目のforループで、51以上になっているのでは?
ka_70040

2024/04/27 08:59

コメントありがとうございます。入れていなかったので、7行目に入れました。ご確認よろしくお願いいたします。
hiroki-o

2024/04/27 09:11

変数の型宣言が面倒なので動作確認していませんが、l = 0でC_ethは51以上になるので、 「1回目は回るのですが、2回目以降、1回でdo-whileのループを出てきてしまっているようです。」 は正しい動きです。
ka_70040

2024/04/27 09:26

追加をありがとうございます。確かにおっしゃる通りでした。 C_ethなどの変数をdoの中に入れたら解決しました。大変助かりました。お手数をおかけしましたが、ありがとうございました。
hiroki-o

2024/04/27 09:41

おめでとうございます。それを回答に書いて「自己解決」にしてください。
guest

回答1

0

自己解決

C_ethなどの変数をdoの中に入れたら解決しました。コメントをくださりありがとうございました。

投稿2024/04/27 09:44

ka_70040

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問