scipy.optimize.curve_fit使用Runtime.getRuntime()。exec()在Java中运行

时间:2019-05-21 20:00:32

标签: java python scipy

我正在使用Process p = Runtime.getRuntime()。exec在Java中运行曲线拟合Python脚本,并且在调用scipy.optimize.curve_fit之一后Java无法获得输出。 我适合如下所示的分段误差函数。

我创建了该函数的“虚拟”版本,以检查曲线拟合是否可以正常工作,并且确实可以。但是,当我将曲线拟合应用于实际数据时,Java不会在该语句下获得任何输出。

我在终端中运行了Python代码,并且运行正常。

Java代码:

String[] command = new String[2];
command[0] = "python";
command[1] = "python/curvefit.py";


try {
    Process p = Runtime.getRuntime().exec(command);
    BufferedReader stdInput = new BufferedReader(new 
    InputStreamReader(p.getInputStream()));
    while ((s1 = stdInput.readLine()) != null) {
        System.out.println(s1);
    }
}catch (IOException e) {
    e.printStackTrace();
}

Python代码

## modifiable error function
def easyerf(x,a,b,c, d):
    return a*scipy.special.erf((b * x) - c) + d

## piecewise error function
def pwerf(x, a1, a2, b, c1, c2, h, e):
    returnarray = []
    for i in x:
        if i < e:
            returnarray.append(easyerf(i, a1, b, c1, h - a1))
        else:
            returnarray.append(easyerf(i, a2, b, c2, h + a2))
    return returnarray


array = np.linspace(-5, 10, 15)
array2 = np.linspace(10, 25, 15)
array3 = [easyerf(i, 4, 1, 1, 1) for i in array]
array4 = [easyerf(i, -4, 1, 15, 1) for i in array2]
array5 = np.concatenate((array,array2)) # x values
array6 = np.concatenate((array3,array4)) # y values
pguess7 = [10, -4, 17, 1, 15, 1, 10]

par3, con3 = scipy.optimize.curve_fit(pwerf, array5, array6, p0 = pguess7)

print("got here")

indexes = [1, 2, 3, 4, 5, 6, 7, 8,... ## long array
intensities = [0.050938000000000004, 0.049611, 0.054938, 0.047958,... ## long array

## fit piecewise error function and find ends/length
par4, con4 = scipy.optimize.curve_fit(pwerf, indexes, intensities, [10, 1, 1, 5, 17, 25,120])
print("now got here")

Java仅打印第二个曲线拟合之后应遵循的第一个“到这里”,而不打印“现在到这里”。同样,它在终端中也可以正常工作。我需要从第二条曲线拟合中获得输出。发生什么事了?

1 个答案:

答案 0 :(得分:0)

更新:解决了。 Java运行的是Python的旧版本,需要curve_fit的参数为numpy数组,而不是列表。