SciPy | Curve Fitting (original) (raw)

Last Updated : 8 Jul, 2025

We often have a dataset comprising of data following a general path, but each data has a standard deviation which makes them scattered across the line of best fit. We can get a single line using curve-fit() function. So given a dataset comprising of a group of points, Curve Fitting helps to find the best fit representing the Data.

Scipy is the scientific computing module of Python providing in-built functions on a lot of well-known Mathematical functions. The scipy.optimize package equips us with multiple optimization procedures. A detailed list of all functionalities of Optimize can be found on typing the following in the iPython console:

help(scipy.optimize)

Among the most used are Least-Square minimization, curve-fitting, minimization of multivariate scalar functions etc.

**Curve Fitting Examples

**Example 1: Sine Function

**Input :

**Code Implementation:

Python `

import numpy as np from scipy.optimize import curve_fit from matplotlib import pyplot as plt

Generate 40 values between 0 and 10

x = np.linspace(0, 10, num=40)

Generate noisy sine data

y = 3.45 * np.sin(1.334 * x) + np.random.normal(size=40)

Sine function model

def test(x, a, b): return a * np.sin(b * x)

Fit the model to the data

param, param_cov = curve_fit(test, x, y)

print("Sine function coefficients:") print(param) print("Covariance of coefficients:") print(param_cov)

Generate fitted values using the optimized parameters

ans = param[0] * np.sin(param[1] * x)

Plot original and fitted data

plt.plot(x, y, 'o', color='red', label="data") plt.plot(x, ans, '--', color='blue', label="optimized data") plt.legend() plt.show()

`

**Output :

Sine function coefficients:

[3.43157585 1.33848481]

Covariance of coefficients:

[[ 4.24498442e-02 -5.39500036e-05]

[-5.39500036e-05 9.25416596e-05]]

2. Example 2: Exponential Function

**Input :

**Code Implementation:

Python `

import numpy as np from scipy.optimize import curve_fit from matplotlib import pyplot as plt

Generate x values between 0 and 1

x = np.linspace(0, 1, num=40)

Generate y values using exponential function with added noise

y = 3.45 * np.exp(1.334 * x) + np.random.normal(size=40)

Exponential function model

def test_exp(x, a, b): return a * np.exp(b * x)

Fit model to data

param, param_cov = curve_fit(test_exp, x, y)

Print optimized parameters and their covariance

print("Exponential function coefficients:") print(param) print("Covariance of coefficients:") print(param_cov)

Generate fitted y values

ans = param[0] * np.exp(param[1] * x)

Plot original data and fitted curve

plt.plot(x, y, 'o', color='red', label='Noisy data') plt.plot(x, ans, '--', color='blue', label='Fitted curve') plt.xlabel('x') plt.ylabel('y') plt.title('Exponential Curve Fitting') plt.legend() plt.show()

`

**Output :

Exponential function coefficients:

[3.75594702 1.26908706]

Covariance of coefficients:

[[ 0.04559006 -0.01531584]

[-0.01531584 0.00581957]]

The blue dotted line is undoubtedly the line with best-optimized distances from all points of the dataset, but it fails to provide a sine function with the best fit.

Curve Fitting should not be confused with Regression. They both involve approximating data with functions. But the goal of Curve-fitting is to get the values for a Dataset through which a given set of explanatory variables can actually depict another variable. Regression is a special case of curve fitting but here you just don't need a curve that fits the training data in the best possible way(which may lead to overfitting) but a model which is able to generalize the learning and thus predict new points efficiently.