"If a worker wants to do his job well, he must first sharpen his tools." - Confucius, "The Analects of Confucius. Lu Linggong"
Front page > Programming > How can I perform exponential and logarithmic curve fitting in Python?

How can I perform exponential and logarithmic curve fitting in Python?

Published on 2024-11-08
Browse:577

How can I perform exponential and logarithmic curve fitting in Python?

Curve Fitting: Exponential and Logarithmic Approaches in Python

While polynomial curve fitting is readily available in Python using polyfit(), this guide explores methods for exponential and logarithmic curve fitting.

Logarithmic Fitting

To fit a line of the form y = A B log x, simply perform a polynomial fit of y against log x.

import numpy as np

x = np.array([1, 7, 20, 50, 79])
y = np.array([10, 19, 30, 35, 51])

coeffs = np.polyfit(np.log(x), y, 1)
print("y ≈", coeffs[1], "log(x)  ", coeffs[0])  # y ≈ 8.46 log(x)   6.62

Exponential Fitting

To fit a line of the form y = Ae^{Bx}, take the logarithm of both sides and perform a polynomial fit of log y against x.

x = np.array([10, 19, 30, 35, 51])
y = np.array([1, 7, 20, 50, 79])

coeffs = np.polyfit(x, np.log(y), 1)
print("y ≈ exp(", coeffs[1], ") * exp(", coeffs[0], " * x) = 0.670 * exp(0.105 * x)")

For better accuracy, leverage weights proportional to y using the w keyword in polyfit().

coeffs = np.polyfit(x, np.log(y), 1, w=np.sqrt(y))
print("y ≈ exp(", coeffs[1], ") * exp(", coeffs[0], " * x) = 4.12 * exp(0.0601 * x)")

Note that most spreadsheet and scientific calculator applications use an unweighted formula for exponential regression, so avoid weights if compatibility is desired.

Using scipy.optimize.curve_fit

If scipy is available, use curve_fit for fitting models without transformations.

from scipy.optimize import curve_fit

# Logarithmic fitting
coeffs, _ = curve_fit(lambda t, a, b: a   b * np.log(t), x, y)
print("y ≈", coeffs[1], "log(x)  ", coeffs[0])  # y ≈ 6.62   8.46 log(x)

# Exponential fitting with initial guess
coeffs, _ = curve_fit(lambda t, a, b: a * np.exp(b * t), x, y, p0=(4, 0.1))
print("y ≈", coeffs[0], "exp(", coeffs[1], " * x) = 4.88 exp(0.0553 x)")

By providing an initial guess, curve_fit can reach the desired local minimum for exponential fitting, resulting in a more accurate fit than the transformed polyfit method.

Latest tutorial More>

Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.

Copyright© 2022 湘ICP备2022001581号-3