蒙特卡罗应用
第1关:蒙特卡洛方法求定积分一
import numpy as np
#将积分函数f定义成匿名函数
###########begin############
f = lambda x: x/25 + 0.2
###########end##############
#在一行输入积分区间【a,b】和实验点数n,用空格分隔
##################begin###############
a,b,n = [eval(i) for i in input().split()]
###################end################
#矩形区域为:[a,b,fmin,fmax],矩形面积=(b-a)*(fmax-fim)
fmin=0
fmax=f(b)
np.random.seed(0)
#利用均匀分布产生n个在【a,b】中的随机数x
#利用均匀分布产生n个在【fmin,fmax】中的随机数y
#################begin##################
x = np.random.uniform(a,b,n)
y = np.random.uniform(fmin,fmax,n)
##################end##################
#统计落在y<f(x)内的点数
p= y[ (y>0) & (y < f(x))].size
#积分面积为y<f(x)内点数除以总实验点数再乘以矩形面积
##############begin################
jf = p/n*(fmax-fmin)*(b-a)
#################end###############
print("%.5f"%jf)
第2关:蒙特卡罗方法求定积分二
import numpy as np
#定义积分函数f(x)
##################begin####################
f = lambda x: 3*x**2 + 4*np.cos(x) - 4*x*np.sin(x)
##################end#######################
#定义求积分值的函数
def jifen(f, a, b, n, fmin,fmax):
#f表示积分函数
#a,b表示积分区间
#n表示总实验点数
#fmin,fmax矩形区域纵向最小和最大值
##################begin#################
x = np.random.uniform(a,b,n)
y = np.random.uniform(fmin,fmax,n)
p = 0
p += y[(y>0) & (y<f(x))].size
p -= y[(y<0) & (y<f(x))].size
return p/n*(b-a)*(fmax-fmin)
###################end###################
np.random.seed(17)
n=int(input())
fmin=0
fmax=f(15)
z=jifen(f, 10,15, n, fmin,fmax)
print("{0:.4f}".format(z))
第3关:蒙特卡洛方法求圆周率
'''求x**2+y**2=1在【-1,1】中的积分
即求y=np.sqrt(1-x**2)在【-1,1】中积分
即求上半圆的面积,np.pi*1**2/2
利用该积分得到的面积可以求出圆周率'''
import numpy as np
#定义积分函数f(x)
#########begin###############
f = lambda x: (1-x**2)**0.5
###########end################
def jifen(f, a, b, n, fmin,fmax):
#f表示积分函数
#a,b表示积分区间,矩形区域横向值
#n表示总实验点数
#fmin,fmax矩形区域纵向最小和最大值
#利用均匀分布产生n个在【a,b】中的随机数x
#利用均匀分布产生n个在【fmin,fmax】中的随机数y
############begin#############
x = np.random.uniform(a,b,n)
y = np.random.uniform(fmin,fmax,n)
##############end##############
#统计落在f(x)内的点数
p= y[ (y>0) & (y < f(x))].size
#积分面积为f(x)内点数除以总实验点数再乘以矩形面积
###########begin################
jf = p/n*(b-a)*(fmax-fmin)
###########end##################
return jf
np.random.seed(11)
n=int(input())
#调用自定函数求f(x)在【0,1】中积分
#############begin#############
z =jifen(f, 0,1, n, 0,1)
#############end###############
#调用自定函数求f(x)在【-1,0】中积分
z1=jifen(f, -1,0, n, 0,1)
w=z+z1 #上半圆的面积,半径为1,即圆周率的一半
print("{0:.4f}".format(w*2))
Numpy图像处理
第1关:图像翻转
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 载入图片并转成numpy数组
im = np.array(Image.open('image/panda.png'))
im = im / 255 # 转到定义域[0,1]
# 1. 水平翻转图片,保存到图片文件filename中
def Turn_1(filename):
im1 = (im[:, ::-1, :] * 255).astype(np.uint8)
Image.fromarray(im1).save(filename)
# 2. 180度翻转图片,保存到图片文件filename中
def Turn_2(filename):
im2 = (im[::-1, ::-1, :] * 255).astype(np.uint8)
Image.fromarray(im2).save(filename)
第2关:图像伽玛转换
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 载入图片并转成numpy数组
im = np.array(Image.open('image/panda.png'))
im = im / 255 # 转到定义域[0,1]
# 1. 提高对比度,Gamma值设为0.4,保存到图片文件filename中
def gammaTrans_1(filename):
# 代码开始
im1 = ((im ** 0.4)*255).astype(np.uint8) # 提高对比
Image.fromarray(im1).save(filename)
# 2. 降低对比度,Gamma值设为4,保存到图片文件filename中
def gammaTrans_2(filename):
# 代码开始
im2 = ((im ** 4)*255).astype(np.uint8) # 提高对比
Image.fromarray(im2).save(filename)
第3关:图像背景颜色改变
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
#载入图片并转成numpy数组
im = np.array(Image.open('image_2/doraemon.webp'))
#修改背景颜色,保存到图片文件filename中
#背景颜色蓝色(RGB值之和在大于350小于460之间),修改为橙色(RGB的值为[255,165,0])
def Background_change(filename):
#代码开始
im2=im.copy()
for i in im2:
x=np.where((np.sum(i,axis=1)>=460)|(np.sum(i,axis=1)<=350))[0]
if len(x)==0:
i[:]=[255,165,0]
else:
i[:x[0]]=i[x[-1]:]=[255,165,0]
# plt.imshow(im2)
Image.fromarray(im2).save(filename)
#代码结束
最小二乘法求线性回归方程
第1关:numpy计算
#全部都交给你了,我只要结果
#Student satrt
import numpy as np
data = [[1, 19.531], [2, 21.719], [3, 22.308], [4, 18.871], [5, 21.107], [6, 25.469], [7, 27.042], [8, 26.827], [9, 27.778], [10, 22.642], [11, 22.309], [12, 26.73], [13, 29.388], [14, 18.519], [15, 23.375], [16, 23.872], [17, 21.259], [18, 22.491], [19, 29.017], [20, 23.483]]
# 转换为 numpy 数组
array = np.array(data)
# 输出数组
print(array)
# data = [[19.531,115], [21.719,122], [22.308,125], [18.871,112], [21.107,61], [6, 25.469], [7, 27.042], [8, 26.827], [9, 27.778], [10, 22.642], [11, 22.309], [12, 26.73], [13, 29.388], [14, 18.519], [15, 23.375], [16, 23.872], [17, 21.259], [18, 22.491], [19, 29.017], [20, 23.483]]
#Student end
md,出题老师真的狗,浪费时间么这不是?
第2关:最小二乘线性回归
import numpy as np
newsample = eval(input())
#Student Start
w,h = newsample
bmi_new = w/(h/100)**2
bmi = [19.531 ,21.719 ,22.308 ,18.871 ,21.107 ,25.469 ,27.042 ,26.827 ,27.778 ,22.642 ,22.309 ,26.73 ,29.388 ,18.519 ,23.375 ,23.872 ,21.259 ,22.491 ,29.017 ,23.483]
ssy = [115,122,125,112,120,140,150,145,152,126,125,143,160,110,130,132,121,126,158,131]
x = np.array(bmi)
y =np.array(ssy)
mx = np.mean(x)
my = np.mean(y)
sx = np.std(x)
sy = np.std(y)
n = len(x)
r = 1/(n-1)*np.sum((x-mx)/sx*(y-my)/sy)
a = r*sy/sx
b = my-a*mx
y_predict = a*bmi_new+b
print(f"{y_predict:.3f}")
#Student End
总结:
这些期末只会出现在选择题,能读懂就行了!~