one-file-projects/rk3.py

38 lines
988 B
Python

#!/usr/bin/env python
import math
import matplotlib.pyplot as plt
def rk3(h,tn,yn,ys,param=[]):
k1 = ys(tn,yn,*param)
k2 = ys(tn+h/2,yn+h*k1/2,*param)
k3 = ys(tn+h,yn - h*k1 + 2*h*k2, *param)
return tn+h, yn + h*(k1/3 + k2/3 + k3/3)
def main():
U = lambda tn,f : math.sin(2*math.pi*tn*f)
R = 5e3
C = 1e-6
us = lambda tn, un, f: (U(tn,f) - un)/(R*C)
fc = 1.0/(2*math.pi*R*C)
frequencies = [ 2**(i) * fc for i in range(-5,8)]
ucmax_list = []
ucmin_list = []
for f in frequencies:
print("Simulation f = %.3f Hz" % f)
ucmax = 0
ucmin = 0
tn = 0
un = 0
for i in range(int(1000*f)):
tn, un = rk3(1/(1000*f), tn, un, us, [f])
ucmax = max(un,ucmax)
ucmin = min(un,ucmin)
ucmax_list.append(ucmax)
ucmin_list.append(ucmin)
plt.plot(frequencies, ucmax_list, 'r', frequencies, ucmin_list, 'b').show()
if __name__ == '__main__':
main()