嗨,我正在尝试将我的数据拟合到两个方程组中,如下所示 这里我有 gamma 与 C_s,其余的 gamma_0、Gamma_inf、a 和 K 是拟合参数。
我没有看到任何错误,但是拟合不起作用,并且每个参数不能为负,但其中一些参数为负。
import numpy as np
from scipy.optimize import curve_fit, fsolve
import matplotlib.pyplot as plt
import pandas as pd
# Prompt the user for the CSV file location
csv_file = input("Enter the path to your CSV file: ")
# Read the CSV file into a DataFrame
df = pd.read_csv(csv_file,header=None)
# Alternatively, select each column by index
# Remember that indices start from 0
Cs_data = df.iloc[:, 0]
gamma_data = df.iloc[:, 1]
# Define the Frumkin equilibrium function to solve for x
def frumkin_x(C_s, a, K, x_guess=0.5):
# Function to find the root of
func = lambda x: x - C_s / (C_s + a * np.exp(K * x))
x_solution, = fsolve(func, x_guess)
return x_solution
# Define the equilibrium isotherm function
def equilibrium_isotherm(C_s, gamma_0, Gamma_inf, a, K):
x = np.array([frumkin_x(cs, a, K) for cs in C_s])
return gamma_0 + Gamma_inf * R * T * (np.log(1 - x) - 0.5 * K * x**2)
# Constants
R = 8.314 # Universal gas constant, J/(mol*K)
T = 298 # Temperature, K
# Initial parameter guesses for curve_fit
# gamma_0, Gamma_inf, a, K
initial_guesses = [72, 0.0000000004, 0.00000007, 0]
params_opt, params_cov = curve_fit(lambda Cs, gamma_0, Gamma_inf, a, K: equilibrium_isotherm(Cs, gamma_0, Gamma_inf, a, K), Cs_data, gamma_data, p0=initial_guesses)
# Print optimized parameters
print("Optimized Parameters:")
print("gamma_0:", params_opt[0])
print("Gamma_inf:", params_opt[1])
print("a (alpha_0/beta_0):", params_opt[2])
print("K:", params_opt[3])
# Plot the original data and fitted curve for visualization
Cs_fit = np.linspace(min(Cs_data), max(Cs_data), 100)
gamma_fit = equilibrium_isotherm(Cs_fit, *params_opt)
plt.scatter(Cs_data, gamma_data, label='Data')
plt.plot(Cs_fit, gamma_fit, label='Fitted Curve', color='red')
plt.xlabel('Sublayer Concentration (Cs)')
plt.ylabel('Surface Tension (gamma)')
plt.legend()
plt.show()
我没有看到任何错误,所以我无法弄清楚问题是什么..
上面的链接包含我的脚本和数据。
你能帮我吗?
由于 x 和 Cs 之间关系的性质,curve_fit 似乎可能会失败。我没有深入研究它太多,但对于给定的 Cs 值可能有多个 x 值或没有 x 值,这一事实可能会违反底层曲线拟合算法所做的假设。请记住,即使关系对于您的值表现良好,curve_fit 算法也可能会在关系表现不佳的值上进行采样。
我不能保证这会起作用,但我建议更深入地研究 Cs 到 x 关系的行为。我不熟悉您在这里所做的科学,但如果在这种情况下 Cs 和 x 之间应该存在 1-1 映射,您可能需要研究方法以确保 frumkin_x 解决方案始终选择正确的“x”值,即使多个解满足方程。