如何根据函数

时间:2016-08-17 03:27:00

标签: python function python-3.x jupyter-notebook

嗨,基本上我想在输入为负时返回1值,如果输入为正则返回另一个值。但不能同时返回。返回的值将用于scipy的curve_fit函数,以确定我的未知参数(a& b)。

我尝试在函数内部使用if循环,但它出现以下错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这是我的代码:

#Input fitting data
PAP_Applied_H = [-5,5,10]
PAP_Eb_fit = [30.7,31.3,31.6]

#Function Fitting
def f2(x,a,b):
    if x<0:
        y=a*((1+(x/b))**2)
    else:
        y=a*((1-(x/b))**2)
    return y

params2,extras2 = curve_fit(f2,PAP_Applied_H,PAP_Eb_fit,p0=(1,15))

#Linear Fitting
linefit2 = py.polyfit(PAP_Applied_H,PAP_Eb_fit,1)
l2 = py.poly1d(linefit2)

x_new2 = list(range(-50000,1000,1))
x_line2 = list(range(-3000,3000,1))
y_func2 = f2(x_new2,params2[0],params2[1])
y_line2 = l2(x_line2)

那么如何更改函数'f2'以便它返回我想要的值?任何帮助,将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:0)

怎么样:

def f(x,a,b):返回a *(1 - 2 * abs(x)/ b +(x / b)** 2)

我知道,这是一种解决方法,并没有解决一般的问题。

答案 1 :(得分:0)

您的输入x是一个列表。您无法检查整个列表的正值或负值。你必须逐个检查每个元素。 试试这个:

def f2(x,a,b):
    y=[]
    for i in range(len(x)):
        if x[i]<0:
            y.append(a*((1+(x[i]/b))**2))
        else:
            y.append(a*((1-(x[i]/b))**2))
    return y

此处返回值y也是值列表。