我正在使用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仅打印第二个曲线拟合之后应遵循的第一个“到这里”,而不打印“现在到这里”。同样,它在终端中也可以正常工作。我需要从第二条曲线拟合中获得输出。发生什么事了?
答案 0 :(得分:0)
更新:解决了。 Java运行的是Python的旧版本,需要curve_fit的参数为numpy数组,而不是列表。