[英]MatLab to Python Euler Equation
所以我正在嘗試學習python,我認為這樣做的一個好方法是采用我之前在MatLab中完成的問題集並將它們轉換為Python。 這是我正在使用的MatLab代碼
% C14 halflife is 5726 years
% The time constant tau is t(1/2)/ln2 = 8260 y
N0=10000; %initialize N0
tau=8260; %Carbon 14
tmax=40000; %max time value, will be on the x-axis
% Generate data using exact values
t1=linspace(0,tmax,100);
N1=N0*exp(-t1/tau);%Here we introduce the equation for nuclear decay
figure
plot1 = plot(t1,N1);
% Generate data using Euler
Step=1000;
N=N0;
NumRes=N;
tx=0:Step:tmax;
% This is the taylor series generation of data.
for t=Step:Step:tmax
N=N-Step*N/tau;
NumRes=[NumRes,N];
end
% Plot the approximation
hold on
plot2 = plot(tx,NumRes,'+');
我為python找到了解決方案的確切部分,如下所示。 但我無法得到近似部分。
import numpy as np
import matplotlib.pyplot as plt
def exact(NO, decay, tmax):
t2 = np.linspace(0,tmax,100)
N2 = NO * np.exp(-t2/decay)
plt.plot(t2,N2)
exact(10000,8260,40000)
我無法弄清楚如何獲得近似部分,但是這是我的嘗試......
Step = 1000
N = 10000
tau = 8260
tx = xrange(0,40000,Step)
result= []
for i in xrange(Step,40000,Step):
result = N - Step*N/tau
plt.plot(tx,result)
plt.show()
我收到的錯誤消息
plt.plot(tx,result)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/pyplot.py", line 3154, in plot
ret = ax.plot(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py", line 1811, in inner
return func(ax, *args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_axes.py", line 1427, in plot
for line in self._get_lines(*args, **kwargs):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 386, in _grab_next_args
for seg in self._plot_args(remaining, kwargs):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 364, in _plot_args
x, y = self._xy_from_xy(x, y)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 223, in _xy_from_xy
raise ValueError("x and y must have same first dimension")
ValueError: x and y must have same first dimension
我是python的新手,顯然我的代碼是錯誤的。 我很樂意為您提供任何幫助。
您的代碼中存在多個問題:
/
(因為所有操作數都是整數)。 xrange(Step, 40000, Step)
但是tx
是xrange(0, 40000, Step)
所以你永遠不會有相同的tx
和result
大小。 以下是對代碼的更正:
Step = 1000
N = 10000.0 # Use a float instead of an int here
tau = 8260
tx = xrange(0, 40000, Step)
result = [N] # Start with a list containing only N
for i in xrange(Step, 40000, Step):
N = N - Step * N / tau # Update N
result.append(N) # Append N to result
plt.plot(tx, result)
plt.show()
既然你正在使用numpy
,這是一個更直接的方式來做你想要的:
tx = numpy.arange(0, 40000, Step)
ty = N * (1 - Step / tau) ** numpy.arange(0, tx.size)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.