用Python轻松画出复杂函数图示
普通积分图像:
from scipy import integrate
import numpy as np
import matplotlib.pyplot as plt
# 定义被积函数
def f(x):
return x ** 2 + np.log(x)
# 定义积分上下限
a = 0 # 积分下限
b = 1 # 积分上限
X = np.linspace(0.001, 1000, 10000)
Y = np.zeros_like(X)
# np.zeros_like()是一个NumPy函数,用于创建一个与给定数组具有相同
# 形状和数据类型的全零数组。
for i, b in enumerate(X):
# enumerate(X)是一个Python内置函数,用于在迭代过程中同时获取索引和
# 对应的元素值。它返回一个可迭代对象,其中每个元素是一个包含索引和元素值的元组。
result, error = integrate.quad(f, a, b)
# 使用 quad 函数进行积分计算
Y[i] = result
plt.plot(X, Y)
plt.xlabel('b')
plt.ylabel('Integral result')
plt.title('Integration of f(x) from a to b')
plt.show()
print("积分结果:", result)
print("误差估计:", error)
# 积分结果: [-7.90775495e-03 -3.32235275e-01 -5.20818628e-01 ... 3.33139261e+08
# 3.33239241e+08 3.33339242e+08]
# 误差估计: [8.77937161e-18 3.68855252e-16 6.66133815e-16 ... 1.90813470e+00
# 1.90813470e+00 1.90813463e+00]
from scipy import integrate
import numpy as np
import matplotlib.pyplot as plt
import math
# 定义被积函数
def f(x):
return pow(1 + (1 / 8 - 1) * pow(math.e, -2*x), -1)
# 定义积分上下限
a = 0 # 积分下限
X = np.linspace(0, 2, 10000)
Y = np.zeros_like(X)
Result = np.zeros_like(X)
Error = np.zeros_like(X)
# np.zeros_like()是一个NumPy函数,用于创建一个与给定数组具有相同
# 形状和数据类型的全零数组。
for i, b in enumerate(X):
# enumerate(X)是一个Python内置函数,用于在迭代过程中同时获取索引和
# 对应的元素值。它返回一个可迭代对象,其中每个元素是一个包含索引和元素值的元组。
Result[i], Error[i] = integrate.quad(f, a, b)
# 使用 quad 函数进行积分计算
Y[i] = Result[i]
plt.plot(X, Y)
plt.xlabel('x')
plt.ylabel('e^x')
plt.title('Integration of f(x) from a to b')
plt.show()
print("积分结果:", Result)
print("误差估计:", Error)
表达式拟合
polyfit()
函数是 NumPy 库中的一个函数,用于进行多项式拟合。其基本用法如下:
numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
参数说明:
-
x
:输入数据的 x 值,可以是数组或列表。 -
y
:输入数据的 y 值,可以是数组或列表。 -
deg
:所拟合多项式的次数(即多项式的阶数)。 -
rcond
:奇异值分解的相对容差,默认为 None。 -
full
:是否返回额外的诊断信息,默认为 False。 -
w
:数据点的权重,默认为 None。 -
cov
:是否返回拟合系数的协方差矩阵,默认为 False。
polyfit()
函数返回多项式拟合的系数数组。
以下是示例代码演示 polyfit()
函数的用法:
import numpy as np
# 示例数据
x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]
# 进行一次多项式拟合
coefficients = np.polyfit(x, y, 1)
print(coefficients)
在上述示例中,我们使用了一组简单的数据 (x, y)
,并将其拟合为一次多项式(直线)。polyfit()
函数返回的 coefficients
列表中,索引为 0 的值就是斜率,索引为 1 的值就是截距。
高次多项式的拟合:
import matplotlib.pyplot as plt
import numpy as np
X = [x for x in range(23)]
Y = [3929, 5308, 7240, 9638, 12866, 17069, 23192, 31443, 38558, 50156, 62948, 75995, 91972, 105711, 122755, 131669,
150697, 179323, 203212, 226505, 248710, 281416, 308746]
# 进行三次多项式拟合
coefficients = np.polyfit(X, Y, 10)
# 计算拟合曲线的预测值
predicted_Y = np.polyval(coefficients, X)
# 计算实际数据的平均值
mean_Y = np.mean(Y)
# 计算 SST 和 SSE
SST = np.sum((Y - mean_Y) ** 2)
SSE = np.sum((Y - predicted_Y) ** 2)
# 计算 R-squared 值
R_squared = 1 - (SSE / SST)
print("R-squared:", R_squared)
# 生成拟合曲线上的点的坐标
Z = np.linspace(min(X), max(X), 100)
W = np.polyval(coefficients, Z)
# 绘制原始数据点和拟合曲线
plt.plot(X, Y, 'ro', label='Data') # 原始数据点
plt.plot(Z, W, label='Fitted curve') # 拟合曲线
# 设置图例和标题
plt.legend()
plt.title('Polynomial Curve Fitting')
# 显示图形
plt.show()
R-squared: 0.9996075723226384
注意拟合的次数不能太高,不然会包含所有的缺点和错误误差
种间竞争模型:
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] = ['Microsoft YaHei']
num = 30
X = np.linspace(0, 40, num)
Y = [0 for i in range(num)]
Z = [0 for i in range(num)]
Y[0] = 151
Z[0] = 199
for i in range(num - 1):
Y[i + 1] = Y[i] * 1.2 - 0.001 * Y[i] * Z[i]
Z[i + 1] = Z[i] * 1.3 - 0.002 * Z[i] * Y[i]
plt.plot(X, Y, marker='o')
plt.plot(X, Z, marker='^')
plt.xlabel("天数")
plt.ylabel("鸟的数目")
plt.show()
如果修改初始值,函数图像的变化将发生巨大变化,也就是对于初始值敏感,这对模型来说将是一个巨大的漏洞。
数据拟合模型自选:
import matplotlib.pyplot as plt
import numpy as np
import math
plt.rcParams['font.family'] = ['Microsoft YaHei']
X = [40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90]
Y = [375, 325, 280, 255, 265, 185, 150, 100, 110, 75, 33]
A = X
B = np.log(Y)
coefficients = np.polyfit(A, B, deg=1)
k = coefficients[0]
lna = coefficients[1]
a = np.exp(lna)
print("a:", a)
print("k:", k)
# 计算拟合曲线的预测值
predicted_Y = a * np.exp(k * np.array(X))
# 计算实际数据的平均值
mean_Y = np.mean(Y)
# 计算 SST 和 SSE
SST = np.sum((Y - mean_Y) ** 2)
SSE = np.sum((Y - predicted_Y) ** 2)
# 计算 R-squared 值
R_squared = 1 - (SSE / SST)
print("R-squared:", R_squared)
# 绘制原始数据点和拟合曲线
plt.plot(X, Y, 'rv', label='Data') # 原始数据点
plt.plot(X, predicted_Y, label='Fitted curve') # 拟合曲线
# 设置图例和标题
plt.legend()
plt.title('Exponential Curve Fitting')
plt.xlabel("X")
plt.ylabel("Y")
# 显示图形
plt.show()
y
=
a
∗
e
k
x
y=a*e^{kx}
y=a∗ekx来拟合,得到的效果很好。
a: 2498.3664060547067
k: -0.04229390829100813
R-squared: 0.8636457092595774