Я пытаюсь подогнать модель под свой набор данных профилей ветра, то есть значения скорости ветра u(z)
на разных высотах z
.
Модель состоит из двух частей, которые я пока упростил до:
u(z) = ust/k * ln(z/z0) for z < zsl
u(z) = a*z + b for z > zsl
В логарифмической модели ust
и z0
являются свободными параметрами, а k
фиксированными. zsl
— высота поверхностного слоя, которая также неизвестна априори.
Я хочу подогнать эту модель к своим данным, и я уже пробовал разные подходы. Лучший результат, который я получаю до сих пор, это:
def two_layer(z,hsl,ust,z0,a,b):
return ust/0.4*(np.log(z/z0)) if z<hsl else a*z+b
two_layer = np.vectorize(two_layer)
def two_layer_err(p,z,u):
return two_layer(z,*p)-u
popt, pcov ,infodict, mesg, ier = optimize.leastsq(two_layer_err,[150.,0.3,0.002,0.1,10.],(wspd_hgt,prof),full_output=1)
# wspd_hgt are my measurements heights and
# prof are the corresponding wind speed values
Это дает мне разумные оценки для всех параметров, кроме zsl
, который не изменяется во время процедуры подгонки. Я предполагаю, что это связано с тем, что используется как порог, а не как параметр функции. Можно ли как-то изменить zsl
во время оптимизации?
Я пробовал что-то с numpy.piece, но это не сработало, возможно, потому, что я не очень хорошо это понимаю, или я мог бы быть совершенно не здесь, потому что это не подходит для моего дела.
По идее, профиль ветра выглядит так, если оси повернуть вспять (на графике z
и u
):