首页 > 编程问答 >使用 pint 和 scipy.integrate.quad

使用 pint 和 scipy.integrate.quad

时间:2024-08-01 05:51:44浏览次数:7  
标签:python scipy pint

我正在尝试采用有限积分,其中所有参数和限制都具有使用品脱定义的与其关联的单位。当我尝试使用 scipy.integrate.quad 进行积分时,我出错了(下面的代码和错误)。难道品脱这时候就不能进行积分了吗?除了删除我的单位然后在积分后将它们添加回来之外,还有其他方法可以解决这个问题吗?

def f(x,y):
    return x
dx=quad(f,0*ureg.nm,1*ureg.nm)
print(dx[0])

DimensionalityError: Cannot convert from 'nanometer' to 'dimensionless'


你绝对可以使用 Pint 来处理 scipy.integrate.quad 函数中的单位,但你必须注意一些事项:

  1. scipy.integrate.quad 期望函数以无量纲的方式返回数值。 这意味着你需要在将你的函数传递给 quad 之前或在函数内部处理好单位。

  2. 确保你的积分上下限具有兼容的单位。

以下是两种使用 Pint 处理你的示例的方法:

方法 1:在积分之前处理单位

在这种方法中,我们在将值传递给 quad 之前,使用 Pint 将函数和积分上下限转换为无量纲的量。

from scipy.integrate import quad
import pint

ureg = pint.UnitRegistry()

def f(x, y):
    return x

# 定义单位化的积分上下限
lower_limit = 0 * ureg.nm
upper_limit = 1 * ureg.nm

# 将积分上下限转换为无量纲的数值
lower_limit_dimensionless = lower_limit.to_base_units().magnitude
upper_limit_dimensionless = upper_limit.to_base_units().magnitude

# 执行积分
result, error = quad(f, lower_limit_dimensionless, upper_limit_dimensionless)

# 将单位添加回结果
result_with_units = result * lower_limit.units * upper_limit.units

print(result_with_units)

这将输出:

0.5 nanometer ** 2

方法 2:在函数内部处理单位

在这种方法中,我们修改函数以在内部处理单位。

from scipy.integrate import quad
import pint

ureg = pint.UnitRegistry()

def f(x, y):
    # 将 x 转换为纳米
    x = x * ureg.nm
    # 执行计算并返回无量纲的结果
    return (x).to_base_units().magnitude

# 定义积分上下限(以无量纲的方式)
lower_limit = 0
upper_limit = 1

# 执行积分
result, error = quad(f, lower_limit, upper_limit)

# 将单位添加回结果
result_with_units = result * ureg.nm ** 2

print(result_with_units)

这将输出与之前相同的结果。

这两种方法都有其优点和缺点。方法 1 更明确,但需要额外的步骤来转换积分上下限。方法 2 更简洁,但可能不太明显发生了什么。选择最适合你的方法。

标签:python,scipy,pint
From: 78818410

相关文章

  • 使用Python时如何避免`setattr`(和`getattr`)?以及是否有必要避免
    如果我想向协议缓冲区中的字段添加一个在编译时未知的值,我目前正在做setattr我通常不喜欢使用setattr,因为它看起来不太安全。但是当我知道该对象是protobuf时,我认为这很好,因为我设置它的值必须是protobuf允许的类型。所以也许它并不是真的不安全?让我举......
  • Java sshtools 生成的 EDDSA 签名与 Python 的 pycryptome 生成的签名不匹配
    我有一个python库,它使用pycryptodomelibrary使用openssh格式的ED25519私钥使用Ed25519算法对数据进行签名。然后需要使用sshtools库和相应的公钥在Java应用程序中验证签名。但是签名验证失败。约束:从文件中读取私钥/公钥很重要。我无法......
  • Elastic python请求超时错误:池达到最大大小,不允许更多连接
    我正在使用Elasticsearchpython模块。我正在尝试像这样建立到服务器的连接es=Elasticsearch([config.endpoint],api_key=config.key,request_timeout=config.request_timeout)服务器连接,然后我尝试执行丰富策略。es.enr......
  • 使用 python 将 JSON 数据空值导入数据库。收到此错误 - 数据需要字符串或类似字节的
    我正在尝试使用python将JSON数据集导入到我的PostgreSQL数据库,但在尝试导入null值时会抛出错误。表的名称是Loan_info。我在python中尝试过此操作:-forfieldinloan_info:ifloan_info[field]in['Null','null',None]:......
  • Python 将脚本转换为 exe 并给出 PermissionError
    我有一个Python(Windows10)脚本,其功能之一是创建备份。这是函数:defcreate_backups(self,file:str,counter:int=None)->None:counter=counteror1res=self.re_obj.match(file)ifresisNoneorlen(res.groups())==0:back_file=......
  • conda update python 不会更新,但 conda update --all 会更新
    我正在尝试更新我的venv。这就是我看到的(base_test)>condaupdatepythonCollectingpackagemetadata(current_repodata.json):doneSolvingenvironment:done==>WARNING:Anewerversionofcondaexists.<==currentversion:4.10.3latestversion:24......
  • 如何使用 Selenium (python) 访问另一个影子根中影子根中的元素?
    我有以下代码和HTML结构(我不是这方面的专家)。我正在尝试抓取HTML代码末尾的96.00C元素,其路径是:Xpath://*[@id="_grid"]/set-class2/div2/text-binding//text()完整Xpath:/html/body/main/div/div3/div3/......
  • 在Python中,如何在一段时间内接受输入
    我正在尝试用Python制作一个蛇游戏,但不知道如何制作它,以便蛇在没有玩家输入的情况下继续移动,所以如果有人知道一个简单的方法来做到这一点,我需要在2秒后取消输入将不胜感激代码如下:importrandomimportsysplayerY=(1)playerX=(0)appleY=random.randint(1,10)appl......
  • 在Python中单步执行代码时是否可以引发异常
    当我在IDE(例如PyCharm)中单步执行代码时,我想转储函数的参数(以供以后使用,例如复制它)。计划的场景是在某处设置断点,然后引发异常(这不在我运行的代码中,这就是重点),并捕获它。代码应该如下所示:defexception_cathcher_decorator(func):try:returnfunc(*f_args,**f_k......
  • 解决python自动化操作异常处理的问题
    在python自动化领域,往往要用到pyautogui,pywin32等模块实现自动化操作。然而,这种自动化操作,本身具有一定的局限性,其中最主要的一个问题就是,一旦执行结果不按照脚本预设的来执行,往往会抛出异常,导致程序中断。解决这个问题,主要有这么几种思路:第一,每一次操作后分情况讨论。这种方......