繁体   English   中英

具有两个指数强制连续性的 Python 拟合数据

[英]Python fit data with two exponential forcing continuity

我正在尝试拟合以下数据

-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()

Fit_picture

您可能想尝试三次样条插值。 在此处查看 user14717 的评论: 是否有用于指数样条插值的 Python 库? .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM