scipy.optimize.curve_fit запускается в Java с использованием Runtime.getRuntime (). exec () - PullRequest
0 голосов
/ 21 мая 2019

Я запускаю скрипт подгонки кривой Python в Java, используя Process p = Runtime.getRuntime (). Exec, и Java не получает вывод после одного из моих вызовов scipy.optimize.curve_fit. Я подгоняю функцию кусочной ошибки, как показано ниже.

Я создал «фиктивную» версию функции, чтобы проверить, будет ли работать подгонка кривой, и это сработало. Но когда я применяю кривую подгонку к фактическим данным, 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 голосов
/ 28 мая 2019

ОБНОВЛЕНИЕ: понял это. Java использует более старую версию Python и требует, чтобы аргументы curve_fit были массивными массивами, а не списками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...