如何使用 Python 显示正确的 sin(x) 函数图?

问题描述 投票:0回答:1

我编写了一个代码,使用 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 还很陌生,哈哈)

python visual-studio-code math trigonometry
1个回答
0
投票

正如其他人提到的,您的自制函数(例如指数和阶乘)正在改变输入,这是不可取的,而且您实际上并不需要从头开始编写它们。这应该可以满足您的要求:

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()

如您所见,缓冲区被定义为存储中间计算或输出值,并且仅读取输入。使用这个技巧,您的输入数组不需要是一维数组,它可以是任何任意形状,并且您仍然可以很好地执行操作。

关于性能的旁注:如果您提前知道输入和缓冲区的大小,请在主计算循环之外定义缓冲区并将它们作为参数传递,以便可以重用它们,而不是不断地分配和取消分配缓冲区已知,大小恒定。

© www.soinside.com 2019 - 2024. All rights reserved.