我正在尝试求解方程组:
其中 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 中执行起来会如此困难,我真的需要一些帮助,拜托。