Python,拟合方程组

问题描述 投票:0回答:1

嗨,我正在尝试将我的数据拟合到两个方程组中,如下所示 enter image description here enter image description here 这里我有 gamma 与 C_s,其余的 gamma_0、Gamma_inf、a 和 K 是拟合参数。

我没有看到任何错误,但是拟合不起作用,并且每个参数不能为负,但其中一些参数为负。 enter image description here

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

我没有看到任何错误,所以我无法弄清楚问题是什么..

上面的链接包含我的脚本和数据。

你能帮我吗?

python scipy curve-fitting
1个回答
0
投票

由于 x 和 Cs 之间关系的性质,curve_fit 似乎可能会失败。我没有深入研究它太多,但对于给定的 Cs 值可能有多个 x 值或没有 x 值,这一事实可能会违反底层曲线拟合算法所做的假设。请记住,即使关系对于您的值表现良好,curve_fit 算法也可能会在关系表现不佳的值上进行采样。

我不能保证这会起作用,但我建议更深入地研究 Cs 到 x 关系的行为。我不熟悉您在这里所做的科学,但如果在这种情况下 Cs 和 x 之间应该存在 1-1 映射,您可能需要研究方法以确保 frumkin_x 解决方案始终选择正确的“x”值,即使多个解满足方程。

© www.soinside.com 2019 - 2024. All rights reserved.