我在使用python simpy包中的nsolve来解决非线性方程时遇到问题,此问题很容易在R中解决,低于我在R中使用的代码以及我在python中尝试的代码:
R:
library(dplyr)
library(plyr)
sol = adply(df,1, summarize,
solution_1 = uniroot.all(function(x)(eval(parse(text=as.character(FX),df))),lower = -10000, upper = 10000, tol = 0.00001))
在Python中:
from sympy import Symbol, solve, nsolve
from sympy.parsing.sympy_parser import parse_expr
import pandas as pd
def ifelse(cond,yes,no):
if (cond):
return(yes)
else:
return (no)
data = {'A': [10,20,30],
'B': [20,10,40],
'FX': ["ifelse(A+B+x<0,0,A+B-x)","ifelse(A+B+x<0,0,A*B-x)","ifelse(A+B+x,A*B-x,A+B-x)"]}
df = pd.DataFrame(data)
x = Symbol("x", real=True)
cols= df.columns
print(cols)
for _, row in df.iterrows():
print(nsolve(parse_expr(row["FX"],local_dict=dict({c:row[c] for c in cols}, **{'x':x,"ifelse":ifelse}) ),x,0))
预期的解决方案是:[30,200,30]
但是返回了以下错误:
TypeError:无法确定Relational的真值
因为python中的代码无法评估A + B-x,所以我不知道如何更改代码,以便它以x的初始值评估表达式。
关于如何解决此问题的任何想法?