[关闭]
@XF 2016-10-09T15:39:41.000000Z 字数 1942 阅读 101

第四次作业


一 摘要

用Python语言编写解一个二元一阶齐次常微分方程组的程序,并解决实际问题。

二 背景介绍

用欧勒法(Euler method)来解常微分方程。对函数N(t)作泰勒展开:

取一阶近似:

对于题目方程:


由欧勒法有:



其中是一个时间常数,我们可以用这组方程近似求出时间后的值.

三 正文

  1. import pylab as pl
  2. class uranium_decay:
  3. def __init__(self, number_of_nuclei_A = 100, number_of_nuclei_B=0, time_constant = 1, time_of_duration = 5, time_step = 0.05):
  4. # unit of time is second
  5. self.n_uranium_A = [number_of_nuclei_A]
  6. self.n_uranium_B = [number_of_nuclei_B]
  7. self.t = [0]
  8. self.tau = time_constant
  9. self.dt = time_step
  10. self.time = time_of_duration
  11. self.nsteps = int(time_of_duration // time_step + 1)
  12. print("Initial number of nuclei A ->", number_of_nuclei_A)
  13. print("Initial number of nuclei B->", number_of_nuclei_B)
  14. print("Time constant ->", time_constant)
  15. print("time step -> ", time_step)
  16. print("total time -> ", time_of_duration)
  17. def calculate(self):
  18. for i in range(self.nsteps):
  19. tmpA = self.n_uranium_A[i] + (self.n_uranium_B[i] / self.tau -self.n_uranium_A[i] / self.tau)* self.dt
  20. tmpB = self.n_uranium_B[i] + (self.n_uranium_A[i] / self.tau -self.n_uranium_B[i] / self.tau)* self.dt
  21. self.n_uranium_A.append(tmpA)
  22. self.n_uranium_B.append(tmpB)
  23. self.t.append(self.t[i] + self.dt)
  24. def show_results(self):
  25. pl.plot(self.t, self.n_uranium_A)
  26. pl.xlabel('time ($s$)')
  27. pl.ylabel('Number of Nuclei A')
  28. pl.show()
  29. pl.plot(self.t, self.n_uranium_B)
  30. pl.xlabel('time ($s$)')
  31. pl.ylabel('Number of Nuclei B')
  32. pl.show()
  33. a = uranium_decay()
  34. a.calculate()
  35. a.show_results()

最后都趋近于50

四、结论

最后50
因为都有相同的衰变常数,且A到B和B到A的过程是可逆的,所以最后会趋近于100的中值,即.

五 感谢

感谢蔡老师的PPT 及杜威同学帮我解决了图片上传的问题。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注