在python中拟合风廓线数据的双层模型

2024-04-26 05:55:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个模型与我的风廓线数据集相匹配,即不同高度的风速值u(z)。在

模型由两部分组成,我现在将其简化为:

u(z) = ust/k * ln(z/z0)     for z < zsl

u(z) = a*z + b              for z > zsl

在对数模型中,ust和{}是自由参数,k是固定的。zsl是表面层的高度,这也是先验未知的。在

我想让这个模型适合我的数据,而且我已经尝试过不同的方法。到目前为止,我得到的最好结果是:

^{pr2}$

这给了我所有参数的合理估计值,除了zsl,它在拟合过程中没有改变。我想这和用作阈值而不是函数参数有关。在优化过程中,我有没有办法让zsl发生变化?在

我试过用逐块地,但这并没有起到很好的作用,也许是因为我不太了解它,或者我可能完全离开这里,因为它不适合我的事业。在

对于这个想法,如果坐标轴颠倒(zu绘制),则风廓线如下所示: Wind profile plot


Tags: 数据方法模型for参数高度过程对数
1条回答
网友
1楼 · 发布于 2024-04-26 05:55:05

我想我终于有了一个解决这类问题的方法,这是我在回答similar question时遇到的。在

解决方案似乎是在两个模型之间的切换处实现一个约束u1 == u2。因为我不能用你的模型来尝试,因为没有发布数据,所以我将展示它在另一个模型中的工作原理,你可以根据你的情况调整它。我使用了一个scipy包装器解决了这个问题,我编写了一个包装器,它使这类问题的拟合更具python性,称为symfit。但是如果您愿意,您可以使用scipy中的SLSQP算法来执行相同的操作。在

from symfit import parameters, variables, Fit, Piecewise, exp, Eq
import numpy as np
import matplotlib.pyplot as plt

t, y = variables('t, y')
m, c, d, k, t0 = parameters('m, c, d, k, t0')

# Help the fit by bounding the switchpoint between the models
t0.min = 0.6
t0.max = 0.9

# Make a piecewise model
y1 = m * t + c
y2 = d * exp(- k * t)
model = {y: Piecewise((y1, t <= t0), (y2, t > t0))}

# As a constraint, we demand equality between the two models at the point t0
# Substitutes t in the components by t0
constraints = [Eq(y1.subs({t: t0}), y2.subs({t: t0}))]

# Read the data
tdata, ydata = np.genfromtxt('Experimental Data.csv', delimiter=',', skip_header=1).T

fit = Fit(model, t=tdata, y=ydata, constraints=constraints)
fit_result = fit.execute()
print(fit_result)

plt.scatter(tdata, ydata)
plt.plot(tdata, fit.model(t=tdata, **fit_result.params).y)
plt.show()

enter image description here

我认为你应该能够根据你的情况来调整这个例子!在

编辑:按照评论中的要求,也可以要求匹配衍生品。为此,上面的示例需要以下附加代码:

^{pr2}$

那应该能起作用了!因此,从编程的角度来看,这是非常可行的,尽管根据模型,这可能实际上没有解决方案。在

相关问题 更多 >