我编写了一个代码,使用 sin(x) 的泰勒级数定义来计算给定角度“x”的正弦:
我的代码是:
import numpy as np
import matplotlib.pyplot as plt
def sin(x):
sine=0
for n in range(0, 5):
sine+=(getExponential(-1, n))*((getExponential(x, (2*n)+1))/(getFactorial((2*n)+1)))
return sine
def getExponential(base, exponent):
exponential=base
if exponent>0:
for i in range(1, exponent):
exponential*=base
elif exponent==0:
exponential=1
else:
exponential=0
return exponential
def getFactorial(num):
factorial=1
for i in range(1, num+1):
factorial*=i
return factorial
x=np.linspace(-1,1,100)
plt.plot(x, sin(x))
plt.grid()
plt.show()
如您所见,最后我尝试绘制从 -1 到 1 的定义函数,并在这些值之间使用 100 个样本。但是一旦我运行我的程序,它就会显示以下内容:
这不是 sin(x) 函数,而是一个奇怪的图,我不知道它来自哪里。我尝试使用 numpy 中包含的 sin 函数并且工作得很好。但无法意识到我的代码有什么问题,它不起作用。如果有人能帮助我,我将非常感激。
(我想澄清一下,我对 Python 还很陌生,哈哈)
正如其他人提到的,您的自制函数(例如指数和阶乘)正在改变输入,这是不可取的,而且您实际上并不需要从头开始编写它们。这应该可以满足您的要求:
import math
import numpy as np
import matplotlib.pyplot as plt
def sin(arr):
buffer = np.empty(arr.size,dtype=np.double)
for i in range(arr.size):
buffer[i]=sin_from_taylor_series(arr[i])
return buffer.reshape(arr.shape)
def sin_from_taylor_series(x,steps=10):
i = (np.arange(steps)*2)+1
series = (x**i)/factorial(i)
return series[::2].sum()-series[1::2].sum()
def factorial(arr):
buffer = np.empty(arr.size,dtype='uint64')
for i in range(arr.size):
buffer[i]=math.factorial(arr[i])
return buffer.reshape(arr.shape)
x = np.linspace(0,2*np.pi)
plt.figure()
plt.plot(x, sin(x))
plt.grid()
plt.show()
如您所见,缓冲区被定义为存储中间计算或输出值,并且仅读取输入。使用这个技巧,您的输入数组不需要是一维数组,它可以是任何任意形状,并且您仍然可以很好地执行操作。
关于性能的旁注:如果您提前知道输入和缓冲区的大小,请在主计算循环之外定义缓冲区并将它们作为参数传递,以便可以重用它们,而不是不断地分配和取消分配缓冲区已知,大小恒定。