我有数据 x 和 y ,想要将一个部分与 power_fit 相匹配,而另一部分与负 power_fit 最终稳定为零,并从一些 -20nm 开始,具有一些 5nF 值,并在最小值 agian 开始上升并变为零后下降。 |我在某些时候被零除。我使用了两个函数,一个在最小值之前,另一个在最小值之后。将 numpy 导入为 np 将 matplotlib.pyplot 导入为 plt 从 scipy.optimize 导入 curve_fit 将 pandas 导入为 pd
def fit_data(x, y): # 定义 x <= xmin 的模型函数 def model1(x, a, x0,ymin): n=13 返回 a / (x_adj**n) + ymin
def fit_data(x, y): # Define the model function for x <= xmin def model1(x, a, x0,ymin): n=13 return a / (x_adj**n) + ymin
def model2(x, b, xmin, y0): # Define the model function for x > xmin
m=7
x_adj = x - xmin
return -b / (x_adj**m) + y0
x_data = np.array(x)
y_data = np.array(y)
ymin = np.min(y_data)
xmin = x_data[np.argmin(y_data)]
mask1 = x_data <= xmin
mask2 = x_data > xmin
x_data1 = x_data[mask1]
y_data1 = y_data[mask1]
x_data2 = x_data[mask2]
y_data2 = y_data[mask2]
# Initial parameter guesses
initial_guess1 = [1e-9, x_data1[0], ymin] # a, x0,ymin
initial_guess2 = [1e-9, xmin, 0] # y0 will be optimized: b, xmin, y0
# Perform the curve fitting for both regions
popt1, pcov1 = curve_fit(model1, x_data1, y_data1, p0=initial_guess1, bounds=bounds1)
popt2, pcov2 = curve_fit(model2, x_data2, y_data2, p0=initial_guess2, bounds=bounds2)
# Generate fitted y values for both regions
y_fitted1 = model1(x_data1, *popt1)
y_fitted2 = model2(x_data2, *popt2)
x_fitted = np.concatenate([x_data1, x_data2])
y_fitted = np.concatenate([y_fitted1, y_fitted2])
# Plot the original data and the fitted curve
plt.scatter(x_data, y_data, label='Data', color='red')
plt.plot(x_fitted, y_fitted, label='Fitted Curve', color='blue')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('Non-linear Fit')
plt.show()
# Print the fitted parameters
print(f'Fitted parameters for region 1: a = {popt1[0]}, x0 = {popt1[1]}, ymin = {popt1[2]}')
print(f'Fitted parameters for region 2: b = {popt2[0]}, xmin = {popt2[1]}, y0 = {popt2[2]}')
以下是使用两个函数将数据拟合到的数据的细分方法:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# Sample data (replace with your actual data)
x_data = np.array([-20, -15, -10, -5, 0, 5, 10, 15, 20])
y_data = np.array([10, 6, 4, 3, 1, 3, 4, 5, 5.5])
# Define the model functions
def model1(x, a, n, x0, ymin):
"""Power function with an offset."""
return a / ((x - x0)**n) + ymin
def model2(x, b, m, x1, y0):
"""Negative power function with an offset, asymptotically approaching zero."""
return -b / ((x - x1)**m) + y0
# Find the index of the minimum y value
min_index = np.argmin(y_data)
# Split the data into two regions
x_data1 = x_data[:min_index + 1]
y_data1 = y_data[:min_index + 1]
x_data2 = x_data[min_index:]
y_data2 = y_data[min_index:]
# Initial parameter guesses
initial_guess1 = [1, 2, -5, 1] # Adjust for model1
initial_guess2 = [1, 2, -5, 0] # Adjust for model2
# Set bounds to prevent division by zero and guide the optimization
bounds1 = ([0, 0, -np.inf, -np.inf], [np.inf, np.inf, np.inf, np.inf])
bounds2 = ([0, 0, -np.inf, -np.inf], [np.inf, np.inf, np.inf, np.inf])
# Perform the curve fitting for both regions
popt1, pcov1 = curve_fit(model1, x_data1, y_data1, p0=initial_guess1, bounds=bounds1)
popt2, pcov2 = curve_fit(model2, x_data2, y_data2, p0=initial_guess2, bounds=bounds2)
# Generate fitted y values for both regions
y_fitted1 = model1(x_data1, *popt1)
y_fitted2 = model2(x_data2, *popt2)
# Combine fitted data for plotting
x_fitted = np.concatenate([x_data1, x_data2])
y_fitted = np.concatenate([y_fitted1, y_fitted2])
# Plot the original data and the fitted curves
plt.scatter(x_data, y_data, label='Data', color='red')
plt.plot(x_data1, y_fitted1, label='Fitted Curve 1', color='blue')
plt.plot(x_data2, y_fitted2, label='Fitted Curve 2', color='green')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.title('Non-linear Fit with Two Functions')
plt.show()
# Print the fitted parameters
print(f'Fitted parameters for region 1: {popt1}')
print(f'Fitted parameters for region 2: {popt2}')
说明:
-
导入:
导入必要的库 (
numpy
,matplotlib.pyplot
,scipy.optimize
). -
示例数据:
替换为的实际
x_data
和y_data
。 - 模型函数:
-
model1(x, a, n, x0, ymin)
:这表示最小值之前的部分。它是一个具有偏移量的幂函数。调整n
以控制曲线的陡度。 -
model2(x, b, m, x1, y0)
:这表示最小值之后的部分。它是一个负幂函数,随着x
的增加而渐近地接近零。 -
数据拆分:
找到
y_data
中最小值的索引 (min_index
),并使用它将数据拆分为两个区域。 - 初始猜测和边界:
-
为两个模型的拟合参数提供
initial_guess1
和initial_guess2
。根据的数据调整这些猜测。 -
bounds
有助于防止除以零的错误,并可以指导优化器获得良好的拟合。 -
曲线拟合:
使用
curve_fit
分别将每个模型拟合到相应的数据区域。 -
生成拟合数据:
使用拟合参数和模型函数生成拟合的
y
值。 - 绘图: 绘制原始数据、两个拟合曲线以及标签和标题。
- 打印参数: 打印两个区域的拟合参数。
提示:
- 仔细选择初始猜测和边界对于获得良好的拟合至关重要。尝试不同的值,看看它们如何影响拟合。
- 如果的数据嘈杂,可能需要考虑使用更稳健的拟合方法或对数据进行预处理以减少噪声。
- 可以调整模型函数以更好地表示的数据。例如,可以尝试使用不同的函数形式或添加更多参数。