MatLab 转 Python:欧拉方程

4

我正在学习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非常陌生,很明显我的代码有问题。希望您能提供任何帮助。


你期望看到什么?而实际上又看到了什么? - Jamie Bull
@JamieBull 我目前只是收到了很多错误信息,我会把它们发布出来。我会看看能否发布MatLab的输出结果。 - Adam Warner
看起来你正在使用Python 2,所以Step*N/tau是一个整数除法,这可能是你的问题。在循环之前尝试将N转换为float - Holt
@Holt 出现了 AttributeError: 'NoneType' 对象没有属性 'append' 的错误。 - Adam Warner
@AdamWarner 请查看我的回答。如果不起作用,请评论。 - Holt
显示剩余2条评论
1个回答

6
您的代码存在多个问题:
  • 您正在覆盖结果而不是将值附加到它上面。
  • 您正在执行整数除法/(因为所有操作数均为整数)。
  • 您正在循环xrange(Step, 40000, Step),但txxrange(0, 40000, Step),因此txresult的大小永远不会相同。
下面是您代码的更正:
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)

对我来说没有用。我尝试打印result.append(N),但我只是一遍又一遍地得到了None。 - Adam Warner
@AdamWarner result.append(N) 总是返回 None。我认为你尝试将 result.append(N) 存储在 result 中,你不应该这样做,请看我的代码。 - Holt
似乎可以工作。现在我只需要弄清楚如何绘图。这就是我收到错误消息的地方。 - Adam Warner
1
@AdamWarner 请查看我的编辑答案,由于您缺少初始的 N 值,因此 resulttx 的大小不一致。 - Holt
感谢您的所有帮助。我接受了您的答案,感谢您容忍我这个 Python 新手的技能。谢谢。 - Adam Warner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接