• 締切済み

サンプル遅れ

επιστημη(@episteme)の回答

回答No.4

ひとつ前の値を保持しておけばいいのなら: #include <stdlib.h> #include <stdio.h> #include <math.h> int main(void){ double dt = 0.001; double t; const double tmax = 1.0; double cur = 0.0; /* 現在値 */ double old; /* ひとつ前 */ for ( t = 0.0; t <= tmax; t += dt ) { old = cur; /* 直前の値をoldに */ cur = 2*cos(2*3.14*60*t); printf("%lf : %lf %lf\n", t, old, cur); } return 0; }

関連するQ&A

  • ルンゲクッタ法で数値解析(C言語)

    コンピュータ(プログラミング)のカテゴリに投稿しようかとも考えましたが、物理学に関する数値計算ということなので、物理学のカテゴリに投稿しました。 単振動や減衰振動、そして強制振動などを数値解析したいと思い、ルンゲクッタ法を使いシミュレートしてみようとしています。ルンゲクッタ法という方法を全く知らなかったので、インターネットや図書館で調べたのですが、どうしても分からないことろがあるので質問することにしました。 書籍やネットの情報を参考にしながら、単振動の場合を数値解析してみました(C言語を使って)。この単振動はうまくできたのですが、どうしても、その先の、減衰振動の数値解析がうまくいかないので、困っています。 ---- #include <stdio.h> double f1(double t,double x,double v); double f2(double t,double x,double v); int main() { double t,x,v,dt,tmax; double k1[2],k2[2],k3[2],k4[2]; x=1.0; //位置の初期値 v=0.0; //速度の初期値 dt=0.01; //刻み幅 tmax=500.0; //繰り返し最大回数 FILE *output; output=fopen("output.dat","w"); for(t=0;t<tmax;t+=dt) { k1[0]=dt*f1(t,x,v); k1[1]=dt*f2(t,x,v); k2[0]=dt*f1(t+dt/2.0,x+k1[0]/2.0,v+k1[1]/2.0); k2[1]=dt*f2(t+dt/2.0,x+k1[0]/2.0,v+k1[1]/2.0); k3[0]=dt*f1(t+dt/2.0,x+k2[0]/2.0,v+k2[1]/2.0); k3[1]=dt*f2(t+dt/2.0,x+k2[0]/2.0,v+k2[1]/2.0); k4[0]=dt*f1(t+dt,x+k3[0],v+k3[1]); k4[1]=dt*f2(t+dt,x+k3[0],v+k3[1]); x=x+(k1[0]+2.0*k2[0]+2.0*k3[0]+k4[0])/6.0; v=v+(k1[1]+2.0*k2[1]+2.0*k3[1]+k4[1])/6.0; fprintf(output,"%f %f %f\n",t,x,v); } fclose(output); return 0; } double f1(double t,double x,double v) { return v; } double f2(double t,double x,double v) { return (-x); } ---- このソースは単振動のもので、減衰振動のときは、最後の方の ---- double f1(double t,double x,double v) { return v; } double f2(double t,double x,double v) { return (-x); ---- の部分が変わるのだと思うのですが、よく分かりません。 減衰振動は、mx"=-kx-rx'で表されるので、この式を変形(?)したものが、入るのかな、という予想程度にしか分かりません。 ソースをどのように変えれば減衰振動を解析できるのでしょうか。 どなたか詳しい方、教えてください。お願いします。

  • マクロでの複素関数の計算

    ExcelのVBAマクロで時間をtとおいて、exp(ti)=cost+isin(t)の実部と虚部を表示するプログラムを作成したいと思っています。 ソースは以下のようになっています。 Sub z() Dim t As Double, tmax As Double Dim dt As Double Dim x As Double Dim count As Integer t = 0 tmax = 1 dt = 0.0001 count = 1 x = 0 While t < tmax With Sheet1 .Cells(count, 1) = t '時刻t .Cells(count, 2) = WorksheetFunction.ImReal(x) '実部 .Cells(count, 3) = WorksheetFunction.ImReal(x) '虚部 End With count = count + 1 '書き込む行を更新 x = Exp(t * i) t = t + dt '時刻を一ステップ更新 Wend End Sub これを実行すると、2列目にcos(t),3列目にsin(t)が表示されると思ったのですが、2列目には1が永遠に並び、3列目には0が並びます。複素数の設定をしていないのが原因なのか何か分からないのでもし表示される方法が分かられるかたがいらっしゃいましたらご教授お願いいたします。

  • 減衰振動の微分方程式の解

    先生から配られたプリントには減衰振動の微分方程式が「m(dx/dt)^2+2γ・dx/dt+ω^2x=0」の時、解が「x=A・EXP(-γt)cos(ω´t+φ)」って書かれてます。 摩擦:гならг/m=2γ、バネ定数:kならk/m=ω^2、A=√C1^2+C2^2、φ=C1/C2、ω´^2=ω^2-γ^2です。 解の式で、cosじゃなくてsinではないのですか?単振動・強制振動の場合も同様にcosでした。 誰かよろしくお願いいたします。

  • d^2/dt^2 + 3kz/m -3kh/(2m)=0 の解き方

    d^2/dt^2 + 3kz/m -3kh/(2m)=0 の解き方 d^2/dt^2 + 3kz/m -3kh/(2m)=0 の特解z'は z'=m/(3k)*3k/(2m)*h=h/2 一般解はz=A sin(ωt+δ)+h/2 (ω=√(3k/m)) なのですが、 なぜこうなるのかが分かりません。 つまり、この微分方程式の解き方が分かりません。 どなたか、教えていただけるとうれしいです。

  • RLC回路について

    RLC回路について 交流起電力 V=V?cosωtで L × dI/dt + RI +1/C × Q = V?cosωt 両辺をtで微分して dq/dt = I より L × d2I/dt2 + R × dIdt + 1/C×I = -ωV?sinωt この方程式でsinωtをどうにかオイラーの公式を使い実数で表して 特殊解 I = I?cos(ωt - δ) ただし I? = V?/{R? + (Lω - 1/Cω)?}?/?     tanδ = (Lω - 1/Cω)/R を求めるまでの過程が調べたのですがわかりません。 どなたかアドバイスお願いします。

  • 微分方程式の解法を教えてください!

    常微分方程式の解法はどんなものがあり、どのような場合に適用すれば解けるでしょうか。 解法を覚えても、それが適用される場合についての判断ができません。教えてください! 以下の場合だとどのように解けばよいでしょうか。 (1)d^2x/dt^2+ω^2x=0の一般解の求め方。(ωは定数) (2)dx/dt=-c^2y、 dy/dt=c^2x の一般解の求め方。(cは定数) (3)dx/dt=u、    du/dt=-kx-cu+f(t) (k,cは定数)  のとき  (1)f(t)=0のとき、t=0でx=x0のもとでの解を求め   る。  (2)f(t)=cosωtのときの解。

  • 複素関数論

     以下の証明ができません。 解答方針だけでもいいので、どなたか教えてください。  u1=u(x1(t),y1(t)) v1=v(x1(t),y1(t)) u2=u(x2(t),y2(t)) v2=v(x2(t),y2(t)) とし、  cosθ={(dx1/dt*dx2/d2)+(dy1/dt*dy2/dt)}/√[{(dx1/dt)^2+(dy1/dt)^2}+{(dx2/dt)^2+(dy2/dt)^2}] cosθ'={(du1/dt*du2/d2)+(dv1/dt*dv2/dt)}/√[{(du1/dt)^2+(dv1/dt)^2}+{(du2/dt)^2+(dv2/dt)^2}] とすると、u(x,y)とv(x,y)がコーシーリーマンの関係式を満たす時   |cosθ|=|cosθ'| となることを示せ。

  • k=1のときcos(1-k)

    k=1のとき (1/2)∫[-T/2,T/2] cos(1-k) t dt =(1/2)∫[-T/2,T/2] 1 dt =T/2 と本に書いてあるんですが、 cos(1-1) = cos(0) = 1 で元々のtは消えないので =(1/2)∫[-T/2,T/2] t dt じゃないですか? でも、計算結果はT/2になるべきところなので、私の勘違いだと思います。その勘違いをご指摘下さい。お願いします。

  • 電磁気・力学の3次元振動の複合問題です。

    電荷qの荷電粒子がF=-krの向心力、z方向の一定な磁場によるローレンツ力q dr/dt × B, 減衰力-mγdr/dt をうけて運動するとき、x方向に交流電場E0cosωtが加えられたとき、定常状態における<x(t)^2 + y(t)^2>を求めよ。ただし<>は運動の一周期2π/ωでの時間平均である。 m:粒子の質量,k:正の定数,γ:減衰定数 ω0=√(k/m)とすると、ω0>>qB/m , ω0>>γ という条件をつかって近似に使えます。 自分ではまず交流電場を無視した時の非同次の方程式から求めた解を出して、それが定常状態ではすなわちt→∞とできるので、結局この解はゼロに収束するとわかりました。なので、交流電場が加えられたときの定常状態では角周波数ωの特解を自分でおいてどうにか解けばいいと思いましたが、具体的にどうすればいいのかわからなくなり、Give upです。 時間平均とかの定義は大丈夫なので、方針、運動方程式、特解の置き方、方程式の解き方、結果など…特に式は自分で立てられたので、微分方程式の解き方を中心に簡単に示していただければありがたいです。もちろん大変は承知で、全部解いてくれる方がいれるともっとありがたいです。

  • 微分方程式

    d^2x/dt^2+2dx/dt+5x=cosωt の解で、初期条件t=0において x=1,dx/dt=0を満たすものを求めよ 解き方が分かりません。 教えてください。