66674


以下のコードでは、tが 0.0 ～ 5.0 の範囲で動作が繰り返されていると思いますが、「tが 0.15 より大きくなったら、Eを 1.2
にする(最初はE=0.38)」という条件を付けくわえることはできるでしょうか?

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    
    def f(x, v, t):
        M=1.0 
        E=0.38
        D=0.1
        return (M-E*np.sin(x)-D*v)/J
    
    J = 0.00424 # 
    t0 = 0.0
    t1 = 5.0
    
    N = 500
    
    
    
    del_t = (t1-t0)/N # time grid
    
    tpoints = np.arange(t0, t1, del_t)
    xpoints = []
    vpoints = []
    
    # initial condition
    x0 = 0.65345
    v0 = 0.0
    
    
    x, v = x0, v0
    
    
    for t in tpoints:
    
            xpoints.append(x)
            vpoints.append(v)
    
            k1v =f(x, v, t)*del_t
            k1x = v * del_t
    
            k2v =  f(x+k1x/2, v+k1v/2, t+del_t/2 )*del_t
            k2x =(v+k1v/2)*del_t 
    
            k3v =f (x+k2x/2, v+k2v/2, t+del_t/2 )*del_t
            k3x =(v+k2v/2 ) *del_t 
    
            k4v = f(x+k3x, v+k3v, t+del_t )*del_t
            k4x = (v+k3v )*del_t 
    
    
    
            v += (k1v + 2 * k2v + 2* k3v + k4v)/6
            x += (k1x + 2 * k2x + 2* k3x + k4x)/6
    
        print(x)
    
    plt.plot (tpoints, xpoints, 'o',label='4th order Runge-Kutta')
    plt.xlabel("t",  fontsize=24)
    plt.ylabel("x(t)",  fontsize=24)
    
    #tt=np.arange(t0, t1, 0.01*del_t)
    #plt.plot (tt, np.sin(tt), '-',label='Exact: Sin (t)',color = 'Green')
    plt.legend(loc='upper right')
    
    plt.show()
    
    plt.plot (tpoints,vpoints, 'o',label='4th order Runge-Kutta')
    plt.xlabel("t", fontsize=24)
    plt.ylabel("v(t)", fontsize=24)
    
    #tt=np.arange(t0, t1, 0.01*del_t)
    #plt.plot (tt, np.cos(tt), '-',label='Exact: Cos (t)', color = 'red')
    plt.legend(loc='upper right')
    
    plt.show()
    
[/code]


CC BY-SA 4.0
2020-05-16T12:51:34.437
66673
2020-05-17T21:08:03.703
2020-05-17T21:08:03.703
3068
40181
question
python 数値解析
ループの途中で条件に応じて値を変更する方法について


`def f(x, v, t):`の中の`E=0.38`を変えるだけで良いのなら、以下のように出来るでしょう。

[code]

    E=0.38 if (t <= 0.15) else 1.2
    
[/code]


CC BY-SA 4.0
2020-05-16T13:39:47.660
66674
2020-05-16T13:39:47.660
26370
66673
answer