numpy TypeError:在绘制复杂函数的积分时,只能将长度为1的数组转换为Python标量

6jygbczu  于 2023-10-19  发布在  Python
关注(0)|答案(1)|浏览(98)

我正在尝试使用以下代码绘制一个复杂函数的积分:

import matplotlib.pyplot as plt
import numpy as np
import scipy as sp

# Integrable function
def complex_function(f):
    return np.exp(2*np.pi*1j*f*t) * (1/np.tan(f/fs - 1j*(a/(2*np.pi*fs))))/(2*np.pi*1j*fs)

def w(t):
    return sp.integrate.quad(lambda f : complex_function(f), -B/2, B/2)[0]

# Variables
B = 1
fs = 1
t = np.linspace(-25, 25, int(50/fs))
a = 1

# Plot
plt.plot(t, w(t), 'b')
plt.show()

出现此错误:

TypeError: only length-1 arrays can be converted to Python scalars

我该怎么解决呢?
我试过改变place的w(t)函数,用arange代替linspace。但同样的错误出现了。

2admgd59

2admgd591#

传递给函数sp.integrate.quad(func, a, b)的函数func必须返回一个真实的值。在你的例子中,complex_function一次计算t的所有值的复数,并返回一个向量/Tensor/数组。要解决这个错误,您需要为t的每个值调用函数complex_function,这样函数complex_function总是返回一个真实的/scaler值。同样,为了调用complex_function获取t的值,需要将t的值传递给函数complex_function。我已经编写了一个这样做的方法,如下所示:

import matplotlib.pyplot as plt
import numpy as np
import scipy as sp

# Integrable function
complex_function = lambda f, t: np.exp(2*np.pi*1j*f*t) * (1/np.tan(f/fs - 1j*(a/(2*np.pi*fs))))/(2*np.pi*1j*fs);

def w(t):
  integral_val = [];
  for t_val in t:
    integral_val.append(sp.integrate.quad(complex_function, -B/2, B/2, args=(t_val,)))
  return integral_val

# Variables
B = 1
fs = 1
t = np.linspace(-25, 25, int(50/fs))
a = 1

# Plot
plt.plot(t, w(t), 'b')
plt.show()

它绘制了函数complex_function的积分。

相关问题