Skip to main content

pyundergraduate

This is a module regarding Numerical Analysis with Python comprising the syllabus covered at the undergraduate level in Indian colleges.

Creator

Archisman Chakraborti
St. Xavier's College, Kolkata, India

pyundergraduate

This module is designed on some well known numerical techniques in Python which are commonly taught at the undergraduate college level to students who have taken a course in Computational Physics and Mathematics.


Current version contents:

  • Differentiation

    • Finite differences method
      • Forward differences
      • Backward differences
      • Central Differences
  • Finding roots of linear and non linear equations

    • Newton Raphson method
    • Secant Method
  • Numerical Integration

    • Trapezoidal Rule
    • Simpsons one-third rule
    • Simpsons three-eighth rule
    • Composite Integration Rules
      • Composite Trapezoidal Rule
      • Composite Simpson's Rule(Modified Simpsons' one third rule)
  • Interpolation

    • Lagrange Interpolation with unequal intervals
    • Newton Forward Interpolation
  • Orinary Differential equation Solvers

    • Euler Method for solving ODEs upto 3rd order.
    • Modified Euler method(Runge Kutta 2 Method) for solving ODEs upto 2nd order.
    • Runge Kutta 4 Method for solving ODEs upto 2nd Order.

Example Code and Techniques

Differentiation

# Finite differences method
import numpy as np

f = lambda x: np.sin(x)
g = lambda x: np.cos(x)
x_pts = np.linspace(0, 10, 100000)

h = .0005

# Forward differences object
differentiator1_f = FiniteDiff(func= f, h=h)


first_deriv_f = differentiator1_f.Forward_First_Deriv() 
second_deriv_f = differentiator1_f.Forward_Second_Deriv() 
third_deriv_f = differentiator1_f.Forward_Third_Deriv() 
fourth_deriv_f = differentiator1_f.Forward_Fourth_Deriv() 

# Alternately for 'nth' order
# Continue using the 'first deriv' method for consecutive derivatives.

# First derivative
differentiator1_f = FiniteDiff(func= f, h=h)
first_deriv_f = differentiator1_f.Forward_First_Deriv() 

# Second derivative
differentiator2_f = FiniteDiff(func= first_deriv_f, h=h)
second_deriv_f = differentiator2_f.Forward_First_Deriv()

# Third derivative
differentiator3_f = FiniteDiff(func= second_deriv_f, h=h)
third_deriv_f = differentiator3_f.Forward_First_Deriv()

# Fourth derivative
differentiator4_f = FiniteDiff(func= third_deriv_f, h=h)
fourth_deriv_f = differentiator4_f.Forward_First_Deriv()

Similarly, for the central difference and the Backward Difference Rules.


Integration

import numpy as np
f = lambda x: x*np.sin(x)
lowerlim = 0
upperlim = 10
intervals = 1000

# Trapezoidal rule
trap_ans = Integration_trapezoidal(f=f, lower_lim=lowerlim, upper_lim=upperlim, intervals=intervals)

# Simpsons one third rule
simp_one_third_ans = Simpson_one_third(f=f, lower_lim=lowerlim, upper_lim=upperlim, intervals=intervals)

# Simpsons three eight rule
simp_three_eight_ans = Simpson_three_eighth(f=f, lower_lim=lowerlim, upper_lim=upperlim, intervals=intervals + 2)

# Composite rules
integrator = CompositeIntegration(func=f, lowerlim=lowerlim, upperlim=upperlim, intervals=intervals)

## Composite Trapezoidal rule
comptrap_ans = integrator.Comp_Trapezoidal_Rule()

## Composite Simpson's rule
compsimp_ans = integrator.Comp_Simpsons_Rule()

ODE Solvers

Solving a 1D ODE

import numpy as np

def dydx(y, x):
    return 1/x
ics1 = [1, 0] # At x = 0, y = 0

# Euler method solutions
y_euler, x_euler = euler(f=dydx, ics=ics1, step_size=0.001, x1=5)

# Modified euler method solutions
y_mod, x_mod = mod_euler(f=dydx, ics=ics1, step_size=0.001, x1=5)

# RK4 solutions
y_rk4, x_rk4 = RK4_solver(f=dydx, ics=ics1, step_size=0.001, x1=5)

Solving a 2D ODE - Equation of a damped harmonis oscillator

def dudt(u, x, t):  # u = dxdt
    b = 0.2  # damping parameter
    k = 20  # Spring constant
    return -b*u - k*x
ics2 = [0, np.pi/50, 0] # At t=0, x = pi/50, vel = 0

# Euler solutions
u_euler, x_euler2, t_euler = euler(f = dudt, ics = ics2, step_size=0.001, x1 = 15)

# Modified euler solutions
u_modeuler, x_modeuler2, t_modeuler = mod_euler(f = dudt, ics = ics2, step_size=0.001, x1 = 15)

# RK4 solutions
u_rk4, x_rk4_2, t_rk4 = RK4_solver(f = dudt, ics = ics2, step_size=0.001, x1 = 15)

Solving a 3rd order ODE using Euler's method

RK4 and RK2 methods are under construction

def dvdx(v, u, y, x):
    return 9*v - 15*u - 25*y

# Here, y = dy/dx(1st derivative), v = dv/dx(second derivative)
v, u, y, x = euler(f = dvdx, ics = [0, np.pi/50, 0, 1], step_size = 0.005, x1 = 5)

Finding root of linear, non linear and transcendal equations numerically.

def func1(x):
    return x**2 + 4*x + 4
def deriv1(x):
    return 2*x + 2

# Secant method
root_finder = SecantMethod(func = func1, guess1=-5, guess2 = -3, iterations=20000, tolerance=0.00000001)
print(f'Secant root = {root_finder.solve()}')
required_iterations = root_finder.required_iterations
print(required_iterations

# Newton Raphson Method
sol_newton = NewtonRaphson(f = func1, f_deriv= deriv1, x0 = 1, error = 0.0000000001, iterations=20000)

Interpolation

# Lagrange Interpolation
def func(x):
        return np.sin(x)

# xlist doesn't need to be evenly spaced
x_list = [1, 2, 2.5, 3.7,  4, 4.6, 5, 6, 6.7, 7.2, 8.5, 9]
y_list = func(x_list)

interpolator = LagrangeInterp(x_list=x_list, y_list=y_list

f = interpolator.GetFunc()  # The interpolatin function


## Lagrange Interpolation points
x_pts = np.linspace(0, 10, 1000)
y_pts = f(x_pts)


# Newton Forward Interpolation
x = np.arange(-5, 6, 1)
y = np.sin(x)

x_pts_NF = np.linspace(-5, 5, 1000)
y_pts_NF = NewtonForward(x_list = x, y_list = y, x = x_pts)

Change Log
==========

0.0.1 (12/05/2022)
-------------------
- First Release

0.0.2 (13/05/2022)
--------------------
Minor Change

0.0.3 (22.5.2022)
-------------------
Minor corrections

Release files for pyundergraduate 0.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyundergraduate 0.0.3
File Size Uploaded
pyundergraduate-0.0.3.tar.gz 16.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyundergraduate 0.0.3
File Interpreter ABI Platform
pyundergraduate-0.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 32.7 kB

Release files / pyundergraduate-0.0.3.tar.gz

Download URL pyundergraduate-0.0.3.tar.gz
Size 16.2 kB
Tags Source
SHA-256 checksum
How to use checksums
6bfff61a55166bc6ad90f4668dbb58a6cb7f35cbd02b961e970a1198ccad8c72
BLAKE2b-256 checksum
How to use checksums
e8acc7402f1b610f989b54c385704a3dd01496d54d3c0cc3467719637bb9407b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.0 CPython/3.10.4

Release files / pyundergraduate-0.0.3-py3-none-any.whl

Download URL pyundergraduate-0.0.3-py3-none-any.whl
Size 16.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
90ff14e17dd5d6f256cb56e0d6144a19e7c938048801b0840310cd91970ef0cc
BLAKE2b-256 checksum
How to use checksums
840a1b4477a640a3bc9b22262587cd48e7c700ff775ed654b5ba6f6c2fd1f4fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.0 CPython/3.10.4

Release history Release notifications | RSS feed

This release

0.0.3 This release

2 release files

0.0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page