如何使用ifelse定义函数在python中找到非线性方程的解

时间:2019-11-21 14:28:09

标签: python r solver evaluation simpy

我在使用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的初始值评估表达式。

关于如何解决此问题的任何想法?

0 个答案:

没有答案