投稿者:エス・テー
投稿日:2012年 4月20日(金)11時31分31秒
|
|
|
1000ccの攪拌機付き容器に濃度3%の食塩水が満杯(1000cc)入っています。いま、ここへ濃度7%の食塩水を徐々に注入していき、ちょうど1000cc注入したところで注入を止めます。このとき、食塩水の濃度は何%になっていますか。という問題です。十進ベーシックでプログラムを組んで解を得たいのですが、どのようなプログラムをつくればよいのか、どなたかお教え下さい。
|
|
|
投稿者:山中和義
投稿日:2012年 4月20日(金)18時55分59秒
|
|
|
> No.1851[元記事へ]
エス・テーさんへのお返事です。
> 1000ccの攪拌機付き容器に濃度3%の食塩水が満杯(1000cc)入っています。いま、ここへ濃度7%の食塩水を徐々に注入していき、ちょうど1000cc注入したところで注入を止めます。このとき、食塩水の濃度は何%になっていますか。という問題です。十進ベーシックでプログラムを組んで解を得たいのですが、どのようなプログラムをつくればよいのか、どなたかお教え下さい。
!食塩水の問題
!a[%]の食塩水x[g]とb[%]の食塩水y[g]を混ぜると、(a*x+b*y)/(x+y)[%]の食塩水x+y[g]となる。
!濃度[%] 食塩水の重さ[g] 食塩の重さ[g]
! a x a*x/100
! b y b*y/100
! c x+y c*(x+y)/100=(a*x+b*y)/100
LET a=1 !1%の食塩水200g
LET x=200
LET b=100 !塩20g
LET y=20
LET c=(a*x+b*y)/(x+y)
PRINT c; "%の食塩水"; x+y; "g"
END
|
|
|
投稿者:島村1243
投稿日:2012年 4月21日(土)07時28分49秒
|
|
|
> No.1851[元記事へ]
エス・テーさんへのお返事です。
> 1000ccの攪拌機付き容器に濃度3%の食塩水が満杯(1000cc)入っています。いま、ここへ濃度7%の食塩水を徐々に注入していき、ちょうど1000cc注入したところで注入を止めます。このとき、食塩水の濃度は何%になっていますか。という問題です。十進ベーシックでプログラムを組んで解を得たいのですが、どのようなプログラムをつくればよいのか、どなたかお教え下さい。
この問題は、濃度X[%]食塩水の比重[g/cc]がm(X)というXの関数で与えられるなら、次の様にしてXの時間経過値を得ることができると思います。
(1)7%食塩水注入流量Q[cc/s](一定)と微小時間Δt[s](一定)を設定する。
(2)注入する食塩水は、微小時間Δt[s]で容器1000[cc]内に一様拡散する。
時刻t=0[s] で注入を開始し、開始t[s]後の溶液濃度をX(t)[%]とすると、この時の容器内塩と水それぞれの重量[g]は、X(t)をXと略記して
塩[g]= X/100*m(X)*1000=10*X*m(X) (1)
水[g]=(100-X)/100*m(X)*1000=(1000-10*X)*m(X) (2)
時刻がtから微小時間Δt[s]経過する間に、
容器に流入する7%食塩水の塩と水それぞれの重量は
塩[g]= 7/100*m(7)*QΔt (3)
水[g]=(100-7)/100*m(7)*QΔt (4)
容器から流出するX%食塩水の塩と水それぞれの重量は
塩[g]= X/100*m(X)*QΔt (5)
水[g]=(100-X)/100*m(X)*QΔt (6)
したがってt+Δt[s]後の容器内濃度X(t+Δt)[%]は
X(t+Δt)={(1)式+(3)式-(5)式}/{(1)式+(2)式+(3)式+(4)式-(5)式-(6)式}*100
={(7*m(7)-X*m(X))*QΔt+1000*X*m(X)}
/{(m(7)-m(X))*QΔt+1000*m(X)}
で表される。
上式を「t=0でX(0)=3」の初期条件を付けて順次各時刻のXを求めて行き、t=1000/Qで計算を停止すれば1000cc注入完了後のXが得られる。
プログラム例は次のようになります。
!SET WINDOW , , ,
DEF m(X)= !ここにmの関数式を記載
Q=1.0 !Q値をセット
dt=0.01 !Δt値をセット
N=1000/Q/dt
t0=0
X0=3
PRINT t0,X0
For k=1 To N
t1=k*dt
X1=((7*m(7)-X0*m(X0))*Q*dt+1000*X0*m(X0))/((m(7)-m(X0))*Q*dt+1000*m(X0))
cc=k*Q*dt !注入量の合計
PRINT t1,X1,cc
!PLOT LINES:t0,X0;t1,X1
t0=t1
X0=X1
Next k
END
|
|
|
投稿者:島村1243
投稿日:2012年 4月21日(土)13時57分15秒
|
|
|
> No.1853[元記事へ]
島村1243さんへのお返事です。
> エス・テーさんへのお返事です。
>
> > 1000ccの攪拌機付き容器に濃度3%の食塩水が満杯(1000cc)入っています。いま、ここへ濃度7%の食塩水を徐々に注入していき、ちょうど1000cc注入したところで注入を止めます。このとき、食塩水の濃度は何%になっていますか。という問題です。十進ベーシックでプログラムを組んで解を得たいのですが、どのようなプログラムをつくればよいのか、どなたかお教え下さい。
濃度X[%]の溶液の比重関数m(X)を m(X)=1+X/100 と近似して下記プログラムを動かすと、濃度Xの時間変化と最終値が見えます。
DEF m(X)=1+X/100 !m(X)の近似式(これで良いのか?ですが。。)
Q=1.0 !Q値をセット
dt=0.05 !Δt値をセット
N=1000/Q/dt
SET WINDOW -100,N*dt,-1,7
DRAW GRID(100,1)
t0=0
X0=3
PRINT "t=";t0;", X(0)=";X0
For k=1 To N
t1=k*dt
X1=((7*m(7)-X0*m(X0))*Q*dt+1000*X0*m(X0))/((m(7)-m(X0))*Q*dt+1000*m(X0))
cc=k*Q*dt !注入量の合計
!PRINT t1;X1;cc
PLOT LINES:t0,X0;t1,X1
t0=t1
X0=X1
Next k
PRINT "t=";t1;", X(t)=";X1;", cc=";cc
END
|
|
|
投稿者:エステー
投稿日:2012年 4月21日(土)18時08分17秒
|
|
|
山中先生、島村1243先生 丁寧な説明とプログラム 本当に有難うございました。濃度X[%]食塩水の比重[g/cc]をm(X)というXの関数で与えて、濃度Xの時間変化と最終値を見るという方法は全く思いつきませんでした。今後共よろしくご指導お願い致します。
ところで。私もプログラムをつくってみました。十進ベーシックを学び始めたばかりで、こういうプログラムでよいのかどうかもわからないのですが、とにかく見て頂きたいと思います。ご意見お聞かせ下さい。
! 食塩水の混合
! 1000ccの攪拌機付き容器に濃度3%の食塩水が満杯(1000cc)
! 入っています。いま、ここへ濃度7%の食塩水を徐々に注入
! していき、ちょうど1000cc注入したところで注入を止める。
! このとき、食塩水の濃度は何%になっているか。
! 注入した食塩水は瞬時に混合されて均質になり、注入された量に
! 等しい量は容器からあふれ出て、容器内は常に1000ccに保たれて
! いるものとする。
LET d=3
LET h=1 ! 注入する食塩水の量(hを小さくすれば精度がよくなる?)
FOR i=1 TO 1000 STEP h
LET s=(d/100)*1000 ! 容器内の食塩の量
LET t=(7/100)*h ! 注入する食塩水中の食塩の量
LET d=(s+t)/(1000+h)*100 ! 容器内の食塩水の濃度
PRINT i;TAB(10);s;TAB(35);t;TAB(45);d
NEXT i
PRINT ""
PRINT " 食塩の量 s=";s
PRINT " 濃度 d=";d
END
! 結果
! h=0.05 cc のとき 5.5270468 %
! h=0.1 cc 5.5270837 %
! h=1 cc 5.5277467 %
! h=10 cc 5.5211551 %
! h=50 cc 5.4924420 %
! h=100 cc 5.4578268 %
|
|
|
投稿者:島村1243
投稿日:2012年 4月21日(土)20時38分46秒
|
|
|
エステーさんへのお返事です。
> ところで。私もプログラムをつくってみました。十進ベーシックを学び始めたばかりで、こういうプログラムでよいのかどうかもわからないのですが、とにかく見て頂きたいと思います。ご意見お聞かせ下さい。
エステーさん、こんにちわ。島村1243です。
エステーさんのプログラム読ませて頂きました。
私はプログラムテクニックは無いので、物理的な観点での意見を書きます。
(疑問点1)
1000という数字は容器の体積[cc]を、記号hは注入溶液の体積[cc]を表しているようですが、溶液の質量パーセント濃度X[%]は
X=溶液中の塩の重量/溶液全体の重量*100
で定義されている。したがって1000ccに濃度%/100を乗じても塩の重量を求めることは出来ない。
求める為にはその濃度を持つ溶液の比重[g/cc]値が必要。
エステーさんは溶液1[cc]は重量1[g]と捉えているようですが、そうだとすると、溶液の濃度に関わらず溶液の比重は常に1[g/cc]になってしまい、一般に食塩水は濃度が増加するに従い比重が1[g/cc]より大きくなる事実に反する。
(疑問点2)
式「d=(s+t)/(1000+h)*100」の分母は、容器の体積が(1000+h)に増大して攪拌していることを意味するから、エステーさんの命題主旨(容器は常に1000ccの体積を保ち攪拌する)に反する。
以上参考になれば幸いです。
なお蛇足ですが、私は「先生」の職ではないので「さん」付けで良いです。
|
|
|
投稿者:山中和義
投稿日:2012年 4月22日(日)13時44分59秒
|
|
|
> No.1855[元記事へ]
エステーさんへのお返事です。
> 食塩水の混合
>
> 1000ccの攪拌機付き容器に濃度3%の食塩水が満杯(1000cc)
> 入っています。いま、ここへ濃度7%の食塩水を徐々に注入
> していき、ちょうど1000cc注入したところで注入を止める。
> このとき、食塩水の濃度は何%になっているか。
>
> 注入した食塩水は瞬時に混合されて均質になり、注入された量に
> 等しい量は容器からあふれ出て、容器内は常に1000ccに保たれて
> いるものとする。
物理的、化学的な複雑な現象を避けるために、
数理モデル
・比重は1[g/mL]とする
・1[cc]=1[mL](=1[g])とする
・飽和を考えない
とする。
このような条件(大まかな考え方)があると思います。
> LET s=(d/100)*1000 ! 容器内の食塩の量
> LET t=(7/100)*h ! 注入する食塩水中の食塩の量
> LET d=(s+t)/(1000+h)*100 ! 容器内の食塩水の濃度
>
> 結果
> h=0.05 cc のとき 5.5270468 %
・『ΔXよりは、dX/dtの式を使う』
上記の現象を、
(a) 濃度b[g/L]の食塩水PΔt[L]を加えて、よくかき混ぜる。
(b) 次に食塩水をPΔt[L]捨てる。
このことをΔtごとに繰り返す。
と考える。
時刻tにおける食塩水の濃度をX(t)[g/L]として、
(a)を行った段階では、
食塩量はX(t)V+(b/100)PΔt、水量はPΔtだけ増えるので、
食塩濃度は、X(t)から(X(t)V+(b/100)PΔt)/(V+PΔt)に変化する。
(b)を行った段階では、
食塩量は減るが濃度は変わらない。
よって、X(t+Δt)≒(X(t)V+(b/100)PΔt)/(V+PΔt)
これより、X(t)が満たす微分方程式をつくる。
X(0),X(Δt),X(2Δt),X(3Δt),…から、Δt→0として連続関数X(t)を得る。
X'(t)
=lim[Δt→0]{(X(t+Δt)-X(t))/Δt}
=lim[Δt→0]{X(t)( V/(V+PΔt) - 1 )/Δt + (b/100)P/(V+PΔt)}
=lim[Δt→0]{-X(t)P/(V+PΔt) + (b/100)P/(V+PΔt)}
=(-P/V)X(t) + (b/100)P/V
=(-X(t) + b/100)P/V
初期条件は、X(0)=a/100となる。
> ところで。私もプログラムをつくってみました。
t秒後の食塩の量をx[g]とする。
時間がtからt+Δtまで変化する間の食塩の増加は、Δx≒((B/100)*PΔt-(x/V)PΔtである。
両辺をΔtで割りΔt→0の極限を取って、微分方程式dx/dt=((B/100)V-x)P/Vを得る。
また、初期条件x(0)=(A/100)*V[g]である。
┌──
│┌─
││
∬ P[g],B[%]を注入する
│~~~~~~│
│ │
┌─┘ V[g],X[%] │容器(最初にV[g],A[%] )
│┌┐ │
││└──────┘
∬ P[g],X[%]を流出させる
LET A=3 !3%
LET B=7 !7%
LET V=1000 !1000g
LET P=1 !g/秒
LET M=10000 !0~10000gまで注入する
LET h=1 !Δt
LET ITER=M/P/h !繰り返し回数
SET WINDOW -2,INT(ITER/100), -1,(INT(B/10)+1)*10
DRAW grid(INT(ITER/100)/10,1) !目盛 [ITER/100]/10 秒ごと、1%ごと
!オイラー法(Euler)
DEF f(t,x)=(B/100*V-x)*P/V !常微分方程式x'(t)=f(x(t))
LET t=0 !t=0
LET x=A/100*V !x[0]
FOR i=0 TO ITER
PRINT t; P*t; x/V*100; (A-B)*EXP((-P/V)*t)+B !時刻[秒]、注入量[g]、濃度[%]
PLOT LINES: t/100,x/V*100; !折れ線で近似する
LET x=x+h*f(t,x) !x[i]=x[i-1]+h*f'(t[i-1],x[i-1])
LET t=t+h
NEXT i
PLOT LINES
END
|
|
|
投稿者:エス・テー
投稿日:2012年 4月23日(月)09時00分7秒
|
|
|
島村1243 さん、いろいろご指摘ありがとうございました。また、勉強してプログラムにも挑戦したいと思います。
|
|
|
投稿者:エス・テー
投稿日:2012年 4月23日(月)09時14分40秒
|
|
|
山中先生、微分方程式作成の手順まで記述していただき、ありがとうございました。
これからもプログラム作成に挑戦してみたいと思います。よろしくお願い致します。
|
|
|
投稿者:島村1243
投稿日:2012年 4月23日(月)10時49分11秒
|
|
|
> No.1858[元記事へ]
エス・テーさんへのお返事です。
> 島村1243 さん、いろいろご指摘ありがとうございました。また、勉強してプログラムにも挑戦したいと思います。
山中さんの解法はm(X)=1と扱い、微係数(導関数)dX/dtを求めてからオイラー法で数値計算を行う、という数学的に正統な方法で、微分や微分方程式の数値解法をご存知の場合はこの方法を使用すべきでしょう。
一方、私の示したX(t+Δt)の計算式は微分やオイラー法という知識を使わない近似計算式ですが、m(X)=1として
{X(t+Δt)-X(t)}/Δt
を展開してからΔtを無限小(ゼロ)にすれば山中さんの示された導関数と同じ式が得られます。
この問題においてm(X)=1と扱った場合の数学的厳密解は、山中さんがプログラム中のPRINT行に示されているように
X(t)=7-4exp(-Qt/1000)
となるので、7%濃度食塩水を1000cc注入完了した時点での容器内濃度X[%]の厳密解は、上式に
Qt=1000[cc]
を代入して得られる
X=7-4exp(-1)=5.528482235....
となるので、エステーさんが作られるプログラムが適切か否かを判断する数値として用いると良いと思います。
なお、私の示したプログラムでも、m(X)=1、Q=1、Δt=0.01とセットし計算実行すると、上記厳密解の小数点以下第5位迄一致する数値が得られます(Δt=0.05にすると少数点以下第3位まで一致に精度低下する)。
|
|
|
戻る