Hi,Below is a fortran program to calculate the roots of an

  • Context: Fortran 
  • Thread starter Thread starter Belgium 12
  • Start date Start date
  • Tags Tags
    Fortran Program Roots
Click For Summary
SUMMARY

The forum discussion centers on a Fortran program designed to calculate the roots of an equation using Newton's method. The user initially encounters an error due to the improper use of the INTENT(IN) attribute for the variable 'x' in the subroutine. After receiving guidance, the user successfully modifies the program by removing the INTENT(IN) declaration, allowing the program to function correctly. The final working code demonstrates the proper implementation of Newton's method with the necessary adjustments.

PREREQUISITES
  • Understanding of Fortran programming language
  • Familiarity with Newton's method for root-finding
  • Knowledge of subroutines and function interfaces in Fortran
  • Experience with the g95 Fortran compiler
NEXT STEPS
  • Study Fortran's variable attributes, particularly INTENT attributes
  • Learn about error handling in Fortran programs
  • Explore advanced numerical methods for root-finding beyond Newton's method
  • Investigate the implications of implicit typing in Fortran
USEFUL FOR

Fortran developers, numerical analysts, and students studying numerical methods who seek to understand and implement root-finding algorithms effectively.

Belgium 12
Messages
40
Reaction score
0
Hi,

Below is a fortran program to calculate the roots of an equation by Newton's method.
I compile the program with the free compiler g95:
g95 -c Newton.f95 then g95 Newton.f95 -o Newton.exe

When I run the program Newton.exe I get the error can't assign value INTENT(IN)::x to

x=x-fx/g(x).It goes wrong at the do loop.When I change x1=x-fx/g(x) I get six times
the same result.
4 33.
What goes wrong with the program.I'm not a specialist.

Thank you for help


! Numerical Mathematics and Computing, Fifth Edition
! Ward Cheney & David Kincaid
! Brooks/Cole Publ. Co.
! Copyright (c) 2003. All rights reserved.
! For educational use with the Cheney-Kincaid textbook.
! Absolutely no warranty implied or expressed.
!
! Section 3.2
!
! File: Newton.f90
!
! Sample Newton's method program using subroutine Newton(f,fp,x,m)
!
program main
integer, parameter :: dp = kind (1d0)
real (kind = dp) :: x, true
integer :: m

interface
function f(x)
integer, parameter :: dp = kind(1d0)
real (kind=dp), intent(in) :: x
end function f
function g(x)
integer, parameter :: dp = kind (1d0)
real (kind=dp), intent(in) :: x
end function g
end interface

m = 6
x = 4.0_dp
call Newton(f,g,x,m)
end program main

subroutine Newton(f,g,x,m)
interface
function f(x)
integer, parameter :: dp = kind(1d0)
real (kind=dp), intent(in) :: x
end function f
function g(x)
integer, parameter :: dp = kind(1d0)
real (kind =dp), intent(in) :: x
end function g
end interface
integer, parameter :: dp = kind(1d0)
real (kind=dp), intent(in) :: x
integer, intent(in) :: m

print *, "n x f(x)"
fx = f(x)
print *, 0, x, fx
do n = 1,m
x = x - fx/g(x)
fx = f(x)
print "(i2, f20.16, f20.16)", n, x, fx
end do
end subroutine Newton

function f(x)
integer, parameter :: dp = kind (1d0)
real (kind = dp) , intent(in) :: x
f = ((x - 2.0_dp)*x + 1.0_dp)*x - 3.0_dp
end function f

function g(x)
integer, parameter :: dp = kind (1d0)
real (kind = dp), intent(in) :: x
g = (3.0_dp*x - 4.0_dp)*x + 1.0_dp
end function g
 
Technology news on Phys.org


Because Fortran passes all parameters by reference the "intent" modifier was added to the language to help prevent unwanted side effects to passed variables. Intent(in) simply informs the compiler that the variable should not be modified during the subroutine or function.

Since your Newton subroutine declares "x" with intent(in) it is not allowed to modify it. Either remove the intent(in) statement and write the main program in such a way that it is immune to any side effects in x, or keep intent(in) and use a new local variable for x within the subroutine.

BTW. The return type of the functions f and g, as well as that of some other variables like fx, doesn't seem to have been declared. You should be really wary of using Fortrans implicit typing.
 
Fortran

Hi,

Thanks to Uart for his help.I changed the program with your suggestions and it works fine.
Here is the program:!


! Numerical Mathematics and Computing, Fifth Edition
! Ward Cheney & David Kincaid
! Brooks/Cole Publ. Co.
! Copyright (c) 2003. All rights reserved.
! For educational use with the Cheney-Kincaid textbook.
! Absolutely no warranty implied or expressed.
!
! Section 3.2
!
! File: Newton.f90
!
! Sample Newton's method program using subroutine Newton(f,fp,x,m)
!
program main
integer, parameter :: dp = kind (1d0)
real (kind = dp) :: x, true
integer :: m

interface
function f(x)
integer, parameter :: dp = kind(1d0)
real (kind=dp), intent(in) :: x
end function f
function g(x)
integer, parameter :: dp = kind (1d0)
real (kind=dp), intent(in) :: x
end function g
end interface

m = 6
x = 4.0_dp
call Newton(f,g,x,m)
end program main

subroutine Newton(f,g,x,m)
interface
function f(x)
integer, parameter :: dp = kind(1d0)
real (kind=dp) :: x
end function f
function g(x)
integer, parameter :: dp = kind(1d0)
real (kind =dp) :: x
end function g
end interface
integer, parameter :: dp = kind(1d0)
real (kind=dp) :: x
integer, intent(in) :: m

print *, "n x f(x)"
fx = f(x)
print *, 0, x, fx
do n = 1,m
x = x - fx/g(x)
fx = f(x)
print "(i2, f20.16, f20.16)", n, x, fx
end do
end subroutine Newton

function f(x)
integer, parameter :: dp = kind (1d0)
real (kind = dp) , intent(in) :: x
f = ((x - 2.0_dp)*x + 1.0_dp)*x - 3.0_dp
end function f

function g(x)
integer, parameter :: dp = kind (1d0)
real (kind = dp), intent(in) :: x
g = (3.0_dp*x - 4.0_dp)*x + 1.0_dp
end function g

I removed the INTENT(IN) instructions in the subprogramma Newton.

Thanks
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 20 ·
Replies
20
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 2 ·
Replies
2
Views
1K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 8 ·
Replies
8
Views
4K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 25 ·
Replies
25
Views
9K