import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.fftpack as fft
# %matplotlib inline
# %matplotlib QT5
#1 傅里叶去除图片噪声
moon_data = plt.imread('moonlanding.png') #ndarray
#plt.figure(figsize=(12,11)) #调整图片显示大小
#plt.imshow(moon_data,cmap = 'gray') #autumn
print(moon_data.shape) #二维 黑白
moon_fft = fft.fft2(moon_data)
print(moon_fft.min())
moon_fft2 = np.where(np.abs(moon_fft)>1e3,0,moon_fft)
moon_ifft = fft.ifft2(moon_fft2) #逆变化
moon_result = np.real(moon_ifft)
plt.figure(figsize=(12,11))
plt.imshow(moon_result,cmap = 'gray')
#2 求积分 求pi
#x**2 + y**2 = 1 #圆心在原点 y = (1 - x**2)^0.5
#pi = 面积*2
x = np.linspace(-1,1,1000)
f = lambda x : (1 - x**2)**0.5
plt.figure(figsize = (4,4) )
plt.plot(x,f(x),x,-f(x),'b')
import scipy.integrate as integrate
pi_1,err = integrate.quad(f,-1,1) #积分值 误差
print("pi:",pi_1*2)
#pi: 3.141592653589797
同理,我们可以试着求一些其他的积分问题:
而且步骤基本都是固定的,关键是确定函数,和积分区间.
这里拿《接力题典1800》的题来练练手
#x = np.linspace(0,1,1000) #确定积分范围(1000可理解为细分1000个等距区间)
x = np.linspace(0,0.9999,1000) #这里积分上限不能选取到1
f = lambda x : (x/(1-x))**0.5 #确定函数,最关键的一步
plt.plot(x,f(x)) #绘制图形
import scipy.integrate as integrate
ans,err = integrate.quad(f,0,1) #积分值 误差
注意:
这里积分上限取到1会报错:RuntimeWarning: divide by zero encountered in true_divide
要是积分里有三角函数怎么办?NumPy 三角函数
要是遇到对数怎么办?np.log(x)
只要多尝试,都是有办法的
那么,可以说,但凡想验证个积分题的结果大致范围,这个方法都能实现!
千锋教育