欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

用Python轻松画出复杂函数图示

最编程 2024-07-28 13:59:54
...

普通积分图像:

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]

1

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=aekx来拟合,得到的效果很好。
a: 2498.3664060547067
k: -0.04229390829100813
R-squared: 0.8636457092595774