Numpy 微积分基础

import sympy
from sympy import *
from sympy.abc import x, y
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 求极限
f = (x ** 2 - 1) / (x - 1)
print(sympy.limit(f, x, 1))

f = sympy.sin(x) / (3 * x + x ** 3)
lim = sympy.limit(f, x, 0)
print(lim)

# 求导数

print(sympy.exp(x))

# 求偏导
f = x ** 2 + 3 * x * y + y ** 2
fx = diff(f, x)
print(fx.evalf(subs={x: 1, y: 2})) # 以字典形式输入自变量


# 梯度下降法求函数最小值
def fun(x, y):
return x - y + 2 * x ** 2 + 2 * x * y + y ** 2
def px(x, y):
return 4 * x + 2 * y + 1
def py(x, y):
return -1 + 2 * x + 2 * y
fig = plt.figure() # 绘制3D图像
ax = Axes3D(fig)
X, Y = np.mgrid[-2:2:50j, -2:2:50j] # 生成n=2维矩阵,从-2到2(闭区间),共40个值
Z = fun(X, Y)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
plt.show()

x, y = 0, 0 # 初始化变量
lr = 0.01 # 定义学习率
z = fun(x, y)
epoch = 0 # 迭代次数
while True:
epoch += 1
n_x, n_y = x - lr * px(x, y), y - lr * py(x, y)
n_z = fun(n_x, n_y)
diff = z - n_z
print(f'epoch {epoch}: x={x}, y={y}, z={z}, diff={diff}')
if abs(diff) < 1e-9:
print(f'result: x={n_x}, y={n_y}')
break
x, y, z = n_x, n_y, n_z

#定积分
import numpy as np
from scipy.integrate import quad #单重积分
func = lambda x:np.cos(np.exp(x))**2 #被积分函数
solution = quad(func, 0, 3) #返回一个元组,第0项为结果,第1项为误差
print(solution[0])

    所属分类:Python     发表于2022-02-03