1

我有当前的代码:

from math import cos, sin, pi
import numpy as np
import matplotlib.pyplot as plt

def f(x):
    
    values = []
    s = 0
    for n in range(1, 6, 1):
        s += -((2/(n*pi))*(((cos((n*pi)/2))-1)*(sin((n/2)*x))))
        values.append(s)
        
    return values

x = np.linspace(-2*pi, 6*pi, 500)
plt.plot(f(x))

我应该绘制 f(x),但是当我运行代码时,我得到了这个错误:

TypeError:只有大小为 1 的数组可以转换为 Python 标量

关于我做错了什么的任何想法?

任何帮助将不胜感激!

4

2 回答 2

1

我认为x公式中的值仅适用于 的一个值x,并且由于您有多个x以列表的形式存在,因此您必须遍历它们中的每一个(例如,使用for xval in x:),执行计算并将计算的值附加到values清单_

from math import cos, sin, pi
import numpy as np
import matplotlib.pyplot as plt

def f(x):
    values = []
    for xval in x:
        s = 0
        for n in range(1, 6, 1):
            s += -((2/(n*pi))*(((cos((n*pi)/2))-1)*(sin((n/2)*xval))))
        values.append(s * -1)
        
    return values

x = np.linspace(-2*pi, 6*pi, 500)
plt.plot(f(x))
plt.show()
于 2021-10-10T18:27:12.983 回答
0

如果您是编程新手,这可能看起来与您现在正在做的有点不同,但是我基本上已经将功能分开来解释每个组件的作用,更重要的是,使用了 numpy 的内置函数,这将被证明是比嵌套循环更有效,尤其是当您的数据变大时。

要了解函数发生了什么f,请在 Python 中查找(列表)推导,但它基本上是一个for用单行表示的循环。

In [24]: import numpy as np
    ...: import matplotlib.pyplot as plt

In [25]: def summand(n, x):
    ...:     """ Return an array of `x`'s size for a given value of `n`.
    ...:     Each element of the array is a value of the function computed
    ...:     at a value in `x` with the given `n`.
    ...:     """
    ...:     return (2 / (n * np.pi)) * (np.cos(n * np.pi / 2) - 1) * np.sin(n * x / 2)
    ...:

In [26]: def f(x, N=5):
    ...:     """ Return the sum of the summands computed for
    ...:     values of `n` ranging from 1 to N+1 with a given array `x`
    ...:     """
    ...:     return sum(summand(n, x) for n in range(1, N+1))
    ...:

In [27]: x = np.linspace(-2*np.pi, 6*np.pi, 500)

In [28]: plt.plot(x, f(x))
Out[28]: [<matplotlib.lines.Line2D at 0x23e60b52a00>]

In [29]: plt.show()

在此处输入图像描述

于 2021-10-10T18:53:19.253 回答