python - Python 拟合具有两个指数强制连续性的数据
问题描述
我正在尝试拟合以下数据
-0.63711376853067669 3.9220188494898451E-011
-0.63559581662374798 4.0260809194317929E-011
-0.63285142318966769 3.7912990158726701E-011
-0.62862863903207122 3.5672466225770418E-011
-0.61915221010943133 3.7041163107924007E-011
-0.60375425889771406 3.7285669699125165E-011
-0.58732715127701596 3.7394414631650330E-011
-0.57049365955914244 3.2793779625097831E-011
-0.55124131200928772 3.3971194033698993E-011
-0.53006060696473212 3.2621926101891416E-011
-0.51035174210462519 3.1395671276394652E-011
-0.48878691498652033 3.3494235593570817E-011
-0.46512080762899560 3.3900831760049202E-011
-0.44144526036934528 3.0434293196110948E-011
-0.41209308065708727 2.4384175101726714E-011
-0.37874291229989432 2.1968353922587969E-011
-0.34595367786265058 2.3395823530179207E-011
-0.31308483194132991 2.2938006752405643E-011
-0.28065779622875503 2.3677078958452214E-011
-0.24589470583567491 2.1177013468924604E-011
-0.20893039650026693 2.2047918048544178E-011
-0.17289648629802296 2.2550123367583211E-011
-0.13712730648282492 2.0960188554218161E-011
-0.10215401377673781 2.2996586055725922E-011
-6.7845096564425861E-002 2.0922405016890511E-011
-3.3994983294004487E-002 2.1451489580936361E-011
0.0000000000000000 2.1859042406659546E-011
通过使用两个指数函数。一个(蓝色)应该适合他们的前半部分,另一个(红色)应该适合后半部分。问题在于,由于存在间隙,因此无法授予功能的连续性。我想通过要求红色曲线从蓝色曲线结束的地方开始来适应第二部分(为了更清楚,请参见下图)。我怎样才能强加这个条件?边界参数是不够的,因为指数匹配是通过方程实现的。
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
def dexp(x, b, c):
return np.exp( b*x + c )
fig1 = plt.figure( figsize=(10,10) )
ax1 = fig1.add_subplot(111)
data = np.genfromtxt('mwe.dat')
ax1.plot(data[:,0], data[:,1], 'k+')
half = len(data)//2
popt, pcov = curve_fit( dexp, data[:half,0], data[:half,1], maxfev=100000)
x = np.linspace( np.min( data[:half,0] ), np.max( data[:half,0] ), half )
ax1.plot( x, dexp( x, *popt), 'b--', linewidth=3)
popt, pcov = curve_fit(dexp, data[half-1:,0], data[half-1:,1])
x = np.linspace( np.min( data[half-1:,0] ), np.max( data[half-1:,0] ), half )
ax1.plot( x, dexp( x, *popt), 'r--', linewidth=3)
fig1.show()
解决方案
您可能想尝试三次样条插值。在此处查看 user14717 的评论:是否有用于指数样条插值的 Python 库?.
推荐阅读
- ajax - WooCommerce 片段更新总项目/小计/总计
- go - 如何在 Golang 中动态调用结构的所有方法?
- swift - While循环,找到最接近零的值
- wordpress - Wordpress 插件上传超时 - nginx
- javascript - 创建简单网站密码的好方法?
- html - 提高 BeautifulSoup 的解析速度
- javascript - JSON 到 HTML 表 JavaScript 不工作
- javascript - 尝试使用 Vue 输出 WordPress 帖子数据时出现问题
- cassandra - 重新格式化时间戳以保持时间和时区
- php - 使用 PHP 抓取 Amazon.com 网页