首页 > 编程问答 >图近似的迭代

图近似的迭代

时间:2024-07-24 08:20:18浏览次数:11  
标签:python arrays numpy matplotlib random

下面的代码运行一个基于微分方程组解生成的图形的模型,并显示了在点上添加了随机 5% 误差的模型。我将如何迭代这个过程(比如 100 次)并收集每个随机图生成的数据?看来我每次都必须创建新模型,这是不可行的。


import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate, optimize
import random

def dose(t, y, b, s, c, p, d):
  target, infectious, virus = y
  return np.array([
      -b * target * virus,
      b * target * virus - s * infectious,
      (1. / (d + 1.)) * p * infectious - c * virus
  ])

def model(D, b, s, c, p):
  solutions = []
  for d in D:
      solution = integrate.solve_ivp(
          dose, [0, 5], y0=[1, 0, 0.01],
          t_eval=[2.8828828828828827], # used to be np.linspace(0, 60, 1000)[48]
          args=(b, s, c, p, d)
      )
      data = solution.y[2, 0] / 0.01950269536785707  
      solutions.append(data)
  return np.array(solutions)

b = 0.00001
s = 4
c = 4
p = 2000000
p0 = (b, s, c, p)

np.random.seed(20)
D = np.logspace(-3, 3, 7)
z = model(D, b, s, c, p)
s = np.ones_like(z) * 0.05
n = random.gauss(0,z*0.05)
zn = z + n

popt, pcov = optimize.curve_fit(
  model, D, zn, p0=[1e-5, 1, 1, 1e6],
  method="trf", bounds=(0, np.inf),
  sigma=s, absolute_sigma=True
)

# (array([1.98458777e-05, 3.39383754e+00, 4.55115392e+00, 1.00007348e+06]),
#  array([[ 8.35308599e-10, -3.25230641e-03,  3.73469971e-03,
#          -5.22169803e-11],
#         [-3.25230641e-03,  1.28672442e+04, -1.47634805e+04,
#           2.06436797e-04],
#         [ 3.73469971e-03, -1.47634805e+04,  1.69398903e+04,
#          -2.36868204e-04],
#         [-5.22169803e-11,  2.06436797e-04, -2.36868204e-04,
#           3.31209815e-12]]))

Dlog = np.logspace(-3, 3, 200)
fig, axe = plt.subplots()
axe.scatter(D, zn, label="Data")
axe.semilogx(Dlog, model(Dlog, *popt), label="Fit")
axe.semilogx(Dlog, model(Dlog, *p0), "--", label="Model")
axe.legend()
axe.grid()
plt.show()


import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate, optimize
import random

def dose(t, y, b, s, c, p, d):
  target, infectious, virus = y
  return np.array([
      -b * target * virus,
      b * target * virus - s * infectious,
      (1. / (d + 1.)) * p * infectious - c * virus
  ])

def model(D, b, s, c, p):
  solutions = []
  for d in D:
      solution = integrate.solve_ivp(
          dose, [0, 5], y0=[1, 0, 0.01],
          t_eval=[2.8828828828828827],
          args=(b, s, c, p, d)
      )
      data = solution.y[2, 0] / 0.01950269536785707  
      solutions.append(data)
  return np.array(solutions)

b = 0.00001
s = 4
c = 4
p = 2000000
p0 = (b, s, c, p)

np.random.seed(20)
D = np.logspace(-3, 3, 7)
z = model(D, b, s, c, p)

# We will store the fitting parameters and generated data in these lists
fit_parameters = []
generated_data = []

# Number of iterations for the process
num_iterations = 100

for i in range(num_iterations):
  # Generate noisy data
  n = random.gauss(0, z * 0.05)
  zn = z + n

  # Fit the model to the noisy data
  popt, pcov = optimize.curve_fit(
    model, D, zn, p0=[1e-5, 1, 1, 1e6],
    method="trf", bounds=(0, np.inf),
    sigma=s, absolute_sigma=True
  )

  # Store the fitting parameters and generated data
  fit_parameters.append(popt)
  generated_data.append(zn)

# Convert the lists to numpy arrays for easier analysis
fit_parameters = np.array(fit_parameters)
generated_data = np.array(generated_data)

# --- Visualization (optional) ---
Dlog = np.logspace(-3, 3, 200)

# Plot all the generated data and their fits
fig, axe = plt.subplots()
for i in range(num_iterations):
    axe.semilogx(Dlog, model(Dlog, *fit_parameters[i]), color='grey', alpha=0.2)
    axe.scatter(D, generated_data[i], color='blue', alpha=0.2, s=5) 

# Plot the original model and data for comparison
axe.semilogx(Dlog, model(Dlog, *p0), "--", label="Model")
axe.scatter(D, z, label="Original Data", color='red')

axe.legend()
axe.grid()
plt.show()

This code will:

  1. Iterate the process of adding noise and fitting the model num_iterations times (set to 100 in the example).
  2. Store the fitting parameters ( popt ) and the generated noisy data ( zn ) for each iteration in the fit_parameters and generated_data lists, respectively.
  3. Convert these lists into NumPy arrays for easier analysis after the loop.

The optional visualization part will then plot all the generated data points and their corresponding fits, alongside the original model and data for comparison. You can adjust the plotting parameters like color , alpha , and s to change the appearance of the lines and markers.

This approach avoids creating a new model each time and provides you with the fitted parameters and generated data for further analysis.

标签:python,arrays,numpy,matplotlib,random
From: 78785989

相关文章

  • 在Python多处理中执行二进制信号量或互斥体以进行上下文切换操作
    我正在尝试自动化win应用程序和java应用程序之间的同步关系。我的标准是:启动win和jav应用程序在jav应用程序中执行命令等待jav应用程序的响应使用jav应用程序的响应到Windows应用程序作为输入。在jav应用程序中执行命令win应用程序......
  • 在spyder-python上随机出现的这些奇怪的亮点是什么
    在此处输入图像描述每次我单击此按钮或进行任何更改时,都会创建奇怪的突出显示,当我最小化功能时更是如此。有什么建议如何摆脱这些或可能的原因是什么?谢谢!我尝试更改外观首选项中的设置,但无法影响问题。很抱歉,我无法直接查看或与Spyder界面交互。我是一个AI......
  • 比较Python字典并找到缺失的元素
    我遇到了一个问题,我已经尝试了几天但没有得到任何结果。我想比较两个字典,在一个字典中有“赛前”足球比赛,在第二个字典中有“现场”足球比赛。我想将它们相互比较并打印它们(如果有)没有赛前比赛直播。示例1pre=[{"Home":"Genoa","Away":"In......
  • Python使用Visual Studio打印功能不显示输出
    任务:检查一个整数是正数还是负数。检查整数是否能被2整除。当输入0时,我需要退出循环并报告每个计数和总和。print函数没有显示任何输出。这是我从defmain()开始使用的代码defmain():countpositive=0countnegative=0count_divisible_by_2=0sump......
  • Python 中的像素最小二乘法
    我有一个非线性前向模型,它计算每个像素参数w的灰度图像。我还可以使用scipys优化函数来反转模型。我目前遇到的唯一问题是图像的大小使得这个解决方案非常慢...比如7%的像素在40分钟内计算得很慢。我使用for循环遍历所有像素并按像素应用模型。我尝试过......
  • 无法正确使用“comm.Gatherv()”来收集大小不均匀的 numpy 数组
    我正在学习MPI4Py,我想实现一个简单的程序。解释这里,每个等级都有一个send_array大小rank+1和值分别等于rank+1rank0=[1]rank1=[22]rank2=[333]rank3=[4444]我想收集值rank=0到缓冲区rbuf它的大......
  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......
  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......
  • 尝试使用 pyinstaller 将 python 文件转换为可执行文件时出现 TypeError
    稍后的目的是通过命令行向GPT4all发送问题并将答案存储在文本文档中。我想将阻止代码转换为exe,但它产生了TypeError。这是到目前为止的代码:fromgpt4allimportGPT4Allmodel=GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf",device='cpu')#downloads/loads......
  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......