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

AI Thread Summary
The discussion revolves around a Fortran program designed to calculate the roots of an equation using Newton's method. The user encountered an error related to the INTENT(IN) attribute, which prevents modification of the variable 'x' within the subroutine. The error occurred during the calculation in the do loop, where the program attempted to update 'x' with the expression x = x - fx/g(x). To resolve the issue, a suggestion was made to either remove the INTENT(IN) declaration for 'x' in the subroutine or to use a new local variable for 'x' to avoid modifying the original variable. The user implemented the suggested changes, removing the INTENT(IN) attributes in the subroutine, which allowed the program to run successfully. The revised program correctly calculates the roots without generating errors.
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
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...

Similar threads

Replies
4
Views
2K
Replies
2
Views
1K
Replies
8
Views
2K
Replies
3
Views
2K
Replies
8
Views
4K
Replies
4
Views
2K
Replies
25
Views
8K
Back
Top