scipy.integrate.trapz свести к минимуму, чтобы дать оптимальные границы - PullRequest
0 голосов
/ 03 апреля 2020

Я работаю над этим слишком много часов.

Я пытаюсь оптимизировать проблему integrate.trapz. Я ищу границы интеграла. На изображении вы можете видеть оранжевую линию (функция: fit_fun c). Я ищу границы красной области (изображение), которая дает самый большой интегральный результат, учитывая фиксированное расстояние между границами (distance = tijd_slecht). Таким образом, красная область имеет фиксированную ширину, но может смещаться слева направо, давая самый большой интегральный результат. Я сделал это путем деления 1 на интегральный результат и минимизации этой проблемы.

Однако, минимизация дает начальное предположение как результат. Это связано с тем, что я интегрирую только по x, заданному в качестве границ (это np.arange (k, k + L). Однако, если я изменю это на полную ширину графика (таким образом, 75 точек данных), есть ValueError, так как x трапеции меньше диапазона x данной функции.

Вы можете мне помочь?

tijd_tot = len(gemiddelde) #this is 75, the length of the dataset
gemiddeld_debiet = 4 #m3/s
max_debiet = 6 #m3/s
tijd_slecht = tijd_tot - (tijd_tot * gemiddeld_debiet / max_debiet) #so this is 25, the width of the red area

import scipy.integrate as integrate
from scipy.optimize import minimize_scalar

def fit_func(x, a, b, c, d, e): #function of the orange line
    return a*x**4 + b*x**3 + c*x**2 + d*x + e
def functie(k,L): #function for integral
    x = np.arange(k,k+L) #the boundaries i need to know, given width L (which is 25)
    y1 = fit_func(x,a,b,c,d,e)
    int1 = integrate.trapz(y1,x=x)
    return  1/int1

L = tijd_slecht
minimum = minimize(functie,10,args=(L))
optimale_tijd1 = int(round(minimum.x[0])) #output gives the initial guess
...