Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

subroutine exponentialFit

implicit none
integer, external :: getInteger
integer :: numberOfDataPoints
real, dimension(:), allocatable :: x, y
real :: slope, yIntercept
real :: b, m
integer :: dataPointCounter
numberOfDataPoints = getInteger("Enter number of data points.")
allocate(x(numberOfDataPoints))
allocate(y(numberOfDataPoints))
do dataPointCounter = 1, numberOfDataPoints
write(*,*) "Enter data point", dataPointCounter
read(*,*) x(dataPointCounter)
read(*,*) y(dataPointCounter)
end do
write(*,*) "Original data"
do dataPointCounter = 1, numberOfDataPoints
write(*,*) x(dataPointCounter), y(dataPointCounter)
end do
do dataPointCounter = 1, numberOfDataPoints
y(dataPointCounter) = log(y(dataPointCounter))
end do
write(*,*) "Modified (Linearized) data"
do dataPointCounter = 1, numberOfDataPoints
write(*,*) x(dataPointCounter), y(dataPointCounter)
end do
call leastSquares2(x, y, numberOfDataPoints, slope, yIntercept)
m = slope
b = exp(yIntercept)
write(*,*) "Form of the function: y = b * exp(mx)"
write(*,*) "m = ", m
write(*,*) "b = ", b

deallocate(x)
deallocate(y)
end subroutine exponentialFit

subroutine leastSquares2(x, y, numberOfDataPoints, slope, yIntercept)


implicit none
integer, intent(in) :: numberOfDataPoints
real, dimension(numberOfDataPoints) :: x, y
real :: sumX, sumY, sumXX, sumXY
real :: slope, yIntercept
integer :: dataPointCounter
sumX = 0
sumY = 0
sumXX = 0
sumXY = 0
do dataPointCounter = 1, numberOfDataPoints
sumX = sumX + x(dataPointCounter)
sumY = sumY + y(dataPointCounter)
sumXX = sumXX + (x(dataPointCounter))**2
sumXY = sumXY + ((x(dataPointCounter)) *
(y(dataPointCounter)))
end do
slope = ((sumX * sumY) - (numberOfDataPoints * sumXY)) /
(((sumX)**2) - (numberOfDataPoints * sumXX))
yIntercept = ((sumXX * sumY) - (sumX * sumXY)) /
((numberOfDataPoints * sumXX) - ((sumX)**2))
end subroutine leastSquares2

You might also like