在 pandas 数据帧上使用 scipy NonlinearConstraint 求解非线性方程

2024-02-10

我正在尝试求解方程组:

其中 a、b 和 c 是 pandas 数据框中的列。我曾经使用 Excel,在其中运行宏 通过更改其他列(函数)的值来在一列(残差)中进行查找,但我不知道如何在Python中做到这一点,我已经问过here https://stackoverflow.com/questions/71680795/perform-goal-seek-in-pandas-dataframe,但还没有答案。

我尝试过 fsolve,但结果始终是我最初的猜测,所以,我想它需要一些界限,但 fsolve 不允许引入界限,这就是我尝试 scipyn.NonlinearConstraint 的原因 以下是要解决的数据集和函数:

import numpy as np
import pandas as pd
import scipy.optimize as opt
from scipy.optimize import NonlinearConstraint
a = np.linspace(300,400,30) 
b = np.random.randint(700,18000,30) 
c = np.random.uniform(1.4,4.0,30) 
df = pd.DataFrame({'A':a, 'B':b, 'C':c})


def func(zGuess,*Params):
    x,y,z = zGuess
    a,b,c = Params
    
    eq_1 = (((3.47-np.log10(y))**2+(np.log10(c)+1.22)**2)**0.5) - x
    eq_2 = ((a/101.32) * (101.32/b)** z) - y
    eq_3 = (0.381 * x + 0.05 * (b/101.32) -0.15) - z
    return eq_1,eq_2,eq_3


zGuess = np.array([2.6,20.2,0.92])
up_bound = (9,np.inf,1.1)
low_bound = (0,-np.inf,0)

在这里我尝试用 fsolve 求解:

df['x'],df['y'],df['z'] = zip(*df.apply(lambda x: opt.fsolve(func,zGuess,args=(x['A'],x['B'],x['C'])),1) )

这里使用非线性约束:

df['x'],df['y'],df['z'] = zip(*df.apply(lambda x: NonlinearConstraint(func(zGuess,x['A'],x['B'],x['C']),low_bound,up_bound),1) )

但使用 Nonlinearconstraint 时会出现错误:

类型错误:zip 参数 #1 必须支持迭代

我什至尝试最小化 pandas 数据框:

def func2(zGuess,*Params):
    x,y = zGuess
    a,b,c,n = Params
    
    eq_1 = (((3.47-np.log10(y))**2+(np.log10(c)+1.22)**2)**0.5) - x
    eq_2 = ((a/101.32) * (101.32/b)** n) - y
    
    return eq_1,eq_2,eq_3



zGuess2 = np.array([2.6,20.2])
n = np.linspace(0,1.,500)
for i in n:
    df['x'],df['y'] = zip(*df.apply(lambda x: opt.fsolve(func2,zGuess2,args=(x['a'],x['b'],x['c'],i)),1))
    df['n_calc'] = df.apply(lambda x: (0.381 * x['x'] + 0.05 * (x['b']/101.32) - 0.15),1)
    res = np.abs(df['n_calc'] - i)
    if res <= 1e-5:
        n_solver = i
        df['n_solver'].append(n_solver)
    

我从来没有想过像在 excel 中查找这样简单的东西在 python 中执行起来会如此困难,我真的需要一些帮助,拜托。


我将忽略您问题的熊猫部分,仅解决优化部分。忽略所有的熊猫噪声,您的问题基本上是如何求解具有简单变量界限的方程。这个问题已经回答过很多次了,参见here https://stackoverflow.com/questions/67034006/solve-equation-using-fsolve-with-inequality-equations/67034757#67034757例如。

以下是一些提示:

  • 你的界限没有意义,例如对数仅针对正值定义,而不针对零定义。

  • 请熟悉 np.ndarrays。使用 scipy.optimize 会让您的生活变得更加轻松。

  • 您的 NonlinearConstraint 也没有意义。这是一个可以传递给的对象scipy.optimize.minimize. It is not可调用或优化方法。

  • 如果要求解变量有一定界限的方程,则需要将问题重新表述为非线性优化问题,并通过以下方式求解:scipy.optimize.minimize,请参阅上面链接的答案以了解更多详细信息。请注意,我改变了你的func这样它就会返回一个 np.ndarray。

以下是一个工作版本,可求解数据框中每一行的方程。请随意重写它,以便您可以在内部使用它df.apply().

from scipy.optimize import minimize

def func(zz, *params):
    x,y,z = zz
    a,b,c = params
    
    eq_1 = (((3.47-np.log10(y))**2+(np.log10(c)+1.22)**2)**0.5) - x
    eq_2 = ((a/101.32) * (101.32/b)** z) - y
    eq_3 = (0.381 * x + 0.05 * (b/101.32) -0.15) - z
    return np.array((eq_1,eq_2,eq_3))

bounds = [(1e-6, None), (1e-6, None), (1e-6, None)]
zGuess = np.array([2.6,20.2,0.92])

# create the new columns
df[["x", "y", "z"]] = np.zeros((30, 3))

for i, row in df.iterrows():
    params = row.values[:3]
    res = minimize(lambda x: np.sum(func(x, *params)**2), zGuess, bounds=bounds)
    # res.x contains your solution
    # let's write the values into the dataframe
    for k, val in zip(['x', 'y', 'z'], res.x):
        df.loc[i, k] = val

我从来没有想过像在 excel 中查找这样简单的东西在 python 中执行会如此困难

在不阅读文档的情况下混合几个不同的概念会使任意编程语言中的每项任务变得困难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 pandas 数据帧上使用 scipy NonlinearConstraint 求解非线性方程 的相关文章

随机推荐

  • 读取 Jpeg2000 元数据

    我想找到一个具有 BSD MIT 或同等 许可证的开源库 该库能够读取 XML 或任何 元数据 jp2文件 迄今为止的研究 OpenJpeg https github com uclouvain openjpeg不读取元数据 EasyExi
  • 通过递归使用 XElement 动态构建 Xml

    我是 linq to Xml 的新手 我有一个递归方法作为参数XElement root它应该以表示给定递归深度的相关子树根的方式保存 XML 数据 void recursiveMethod XElement root 更具体地说 还可以看
  • 为什么 Scala 集合中没有不可变的双链表?

    看着this https stackoverflow com q 8039261 770361问题 提问者对某个元素的第一个和最后一个实例感兴趣List 似乎更有效的解决方案是使用DoubleLinkedList可以从列表末尾向后搜索 然而
  • pycharm 代码完成不适用于 SimpleNamespace

    为什么 SimpleNamespace 代码补全在 pycharm 编辑器中不起作用 from types import SimpleNamespace sn SimpleNamespace param a 1 sn pressing do
  • EmberJS 路线事件转换

    emberjs 1 0 0 rc 6 1 我的控制器 Application LoginController Ember Controller extend loginFailed false isProcessing false isSl
  • SIFT匹配和识别?

    我正在开发一个应用程序 其中使用 SIFT RANSAC 和单应性来查找对象 OpenCV C Java 我面临的问题是 在有很多异常值的地方 RANSAC 表现不佳 为此我想尝试一下SIFT的作者说的很好的办法 投票 我读过我们应该在 4
  • Inno Setup 自定义页面

    我想在选择安装位置的页面之后创建一个自定义向导页面 我已经了解了如何创建自定义页面并将其添加到向导中InitializeWizard程序 我的问题是 当我创建自定义页面时 安装位置选择的默认页面不再出现 我必须使用哪些选项来保留默认页面 安
  • 如何删除MySQL中的所有孤立记录?

    我有 3 个表 MySQL MyIsam user id message id userId archivedMessage id userId 如何删除所有没有消息且没有存档消息的用户 你可以使用not exists delete fro
  • MS访问函数vba,宏[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在 MS Access 中制作报告时遇到一个小问题 我用 vba 编写了一个函数 并为 RunCode 函数 创建了一
  • JavaScript 从字符串中删除零宽度空格(unicode 8203)

    我正在编写一些处理网站内容的 JavaScript 当用户按退格键时 SharePoint 文本编辑器倾向于在文本中放置 零宽度空格 字符 这阻碍了我的努力 该字符的 unicode 值为 8203 即十六进制的 B200 我尝试使用默认的
  • 当 git pull 引起冲突但 git pull --rebase 没有冲突时,这意味着什么?

    我正在从只有我有权访问的存储库中提取数据 据我所知 我只从一个存储库推送到它 有几次 我尝试推动它并得到了这个 To email protected cdn cgi l email protection tsched dev git rej
  • 是否有更易读或 Pythonic 的方式将 Decimal 格式化为 2 位?

    将小数固定到两位的语法到底是怎么回事 gt gt gt from decimal import Decimal gt gt gt num Decimal 1 0 gt gt gt num quantize Decimal 10 2 seri
  • 无需在 go 中阅读即可查看 Conn

    我有一个服务器net Conn 我想在读出字节之前先查看一下它 以检查它是否是客户端尝试使用的纯文本协议或 SSL TLS 检查http golang org pkg net http golang org pkg net 看来Conn接口
  • 如何使用 mvc4 C# 在 linq toEntity 预加载中包含多个表

    我有 6 节课 我尝试使用linq到实体以获得SiglaUF最后一个更深层次的表的信息 在视图 MVC 中 问题是我收到以下错误 ObjectContext 实例已被处置 不能再用于需要连接的操作 视图是这样的 gt model IEnum
  • 数组中元素的确切最大限制是多少

    这是一个纯粹的理论问题 所以请不要在你的答案中警告我这一点 如果我没记错的话 因为 NET 中的每个数组都由Int32 意味着索引范围为0 to Int32 MaxValue 假设不涉及内存 GC 约束 NET 中的数组最多可以有21474
  • 如何将原始 html 文件添加到 create-react-app 中的公共文件夹

    我有一个使用 create react app 创建的 React 应用程序 我已经公开了一个静态 html 页面 我想在使用 iframe 的同一应用程序中使用该 html 构建后 带有 covid html 的 iframe 不会加载
  • jquery 延迟链接被跟踪

    我有一个基于 css 的简短动画 我想在链接之前播放它 一张在页面加载时突然进入的卡片在单击后突然弹出 然而 目前 调用的页面加载速度太快 我希望能够短暂延迟 href 的跟踪 这是我所得到的 document ready function
  • 计算两个地理点之间的最短路径?

    我是 Java 和 Android 新手 我需要找到两个路径点之间的最短路径 我一整天都在寻找答案 我刚刚得到了这个代码 var directionDisplay var directionsService new google maps
  • 应用程序更新后小部件消失了

    更新我的应用程序后 有时所有旧的小部件都会从主屏幕上消失 在应用程序启动器 小部件选择器中 我的三个小部件出现两次 直到重新启动 有什么建议么 在本页 https medium com the wtf files the mysteriou
  • 在 pandas 数据帧上使用 scipy NonlinearConstraint 求解非线性方程

    我正在尝试求解方程组 其中 a b 和 c 是 pandas 数据框中的列 我曾经使用 Excel 在其中运行宏 通过更改其他列 函数 的值来在一列 残差 中进行查找 但我不知道如何在Python中做到这一点 我已经问过here https