FORTRAN|简单的数值计算(1)之求解一元方程

本文介绍了使用FORTRAN编程语言实现一元方程的四种数值解法:二分法、弦截法、迭代法和牛顿迭代法。每种方法都包括了主程序和相应的求解函数,用于解决如X^3-2X^2+7X+4=0这类方程,直到达到指定的精度(例如1e-6)。
摘要由CSDN通过智能技术生成

FORTRAN|简单的数值计算(1)之求解一元方程


解方程: X 3 − 2 X 2 + 7 X + 4 = 0 X^3-2X^2+7X+4=0 X32X2+7X+4=0

1. 二分法

主程序包括输入和输出:

PROGRAM EXAM14_1
USE BISECT!应用二分法模块
REAL X1,X2,X
DO
  PRINT*,'输入x1,x2的值:'!输入x1,x2,直到f(x1)和f(x2)异号为止
  READ*,X1,X2
  IF(FUNC(X1)*FUNC(X2)<0.0)EXIT
  PRINT*,'此区间无根,请重新输入!'
END DO
X=SOLVE(X1,X2)!调用求解函数
PRINT 10,'X=',X
10 FORMAT(A,F15.7)
END

二分法模块:

MODULE BISECT
CONTAINS
REAL FUNCTION FUNC(X)!定义方程函数
IMPLICIT NONE
REAL X
FUNC=X**3-2*X**2+7*X+4
END FUNCTION FUNC

REAL FUNCTION SOLVE(X1,X2)!二分法求解函数
IMPLICIT NONE
REAL X1,X2,X,F1,F2,FX
X=(X1+X2)/2.0
FX=FUNC(X)
DO WHILE(ABS(FX)>1E-6)
  F1=FUNC(X1)
  F2=FUNC(X2)
  IF(F1*FX<0)THEN
    X2=X
  ELSE
    X1=X
  ENDIF
  X=(X1+X2)/2.0
  FX=FUNC(X)
END DO
SOLVE=X
END FUNCTION SOLVE
END MODULE BISECT

2. 弦截法

主程序:

PROGRAM EXAM14_2
USE SECANT
REAL X1,X2,X
DO
  PIRNT*,'输入X1,X2的值:'
  READ*,X1,X2
  IF(FUNC(X1)*FUNC(X2)<0)EXIT
  PRINT*,'此区间无跟,请重新输入!'
  END DO
X=SOLVE(X1,X2)!调用求解函数
PRINT 10,'X=',X
10 FORMAT(A,F15.7)
END

弦截法模块:

MODULE SECANT
CONTAINS
REAL FUNCTION FUNC(X)!定义方程函数
IMPLICIT NONE
REAL X
FUNC=X**3-2*X**2+7*X+4
END FUNCTION FUNC

REAL FUNCTION SOLVE(X1,X2)!弦截法求解函数
IMPLICIT NONE
REAL X1,X2,X,F1,F2,FX
X=X2-(X2-X1)/(FUNC(X2)-FUNC(X1))*FUNC(X2)!弦截法与二分法区别
FX=FUNC(X)
DO WHILE(ABS(FX)>1E-6)
  F1=FUNC(X1)
  F2=FUNC(X2)
  IF(F1*FX<0)THEN
    X2=X
  ELSE
    X1=X
  ENDIF
  X=X2-(X2-X1)/(FUNC(X2)-FUNC(X1))*FUNC(X2)!区别
  FX=FUNC(X)
END DO
SOLVE=X
END FUNCTION SOLVE
END MODULE SECANT

3. 迭代法

主程序:

PROGRAM EXAM14_3
USE ITERATION
REAL X0
PRINT*,'输入初值X0:'
READ*,X0
CALL SOLVE(X0)!调用迭代法求解
END

迭代法模块:

MODULE ITERATION
IMPLICIT NONE
INTEGER::MAX=200!最大允许迭代次数
CONTAINS

REAL FUNCTION G(X)!定义迭代函数G(X)
IMPLICIT NONE
REAL X
G=(-X**3+2*X**2-4)/7
END FUNCTION G

SUBROUTINE SOLVE(X)!迭代法求解子程序
IMPLICIT NONE
REAL X,X1
INTEGER I
I=1
X1=G(X)
DO WHILE(ABS(X-X1)>1E-6.AND.I<=MAX)
  PRINT 10,I,X1
  X=X1
  I=I+1
  X1=G(X)
END DO
IF(I<=MAX)THEN
  PRINT 20,'X=',X1!输出计算结果
ELSE
  PRINT 30,'经过',MAX,'次迭代后仍未收敛'
ENDIF
10 FORMAT('I=',I4,6X,'X=',F15.7)
20 FORMAT(A,F15.7)
30 FORMAT(A,I4,A)
END SUBROUTINE SOLVE
END MODULE ITERATION

4. 牛顿迭代法

主程序:

PROGRAM EXAM_14_4
USE NEWTON
REAL X0
PRINT*,'输入初值'
READ*,X0
CALL SOLVE(X0)!调用牛顿迭代法求解子程序
END

牛顿法模块:

MODULE NEWTON
IMPLICIT NONE
INTEGER::MAX=200!最大允许迭代次数
CONTAINS
REAL FUNCTION FUNC(X)!定义方程
  IMPLICIT NONE
  REAL X
  FUNC=X**3-2*X**2+7*X+4
END FUNCTION FUNC

REAL FUNCTION DFUNC(X)!一次导数
  IMPLICIT NONE
  REAL X
  DFUNC=3*X**2-4*X+7
END FUNCTION DFUNC

SUBROUTINE SOLVE(X)!求解子程序
  IMPLICIT NONE
  REAL X,X1
  INTEGER I
  I=1
  X1=X-FUNC(X)/DFUNC(X)
  DO WHILE(ABS(X-X1)>1E-6.AND.I<=MAX)
    PRINT 10,I,X1
    X=X1
    I=I+1
    X1=X-FUNC(X)/DFUNC(X)
  END DO
IF(I<=MAX)THEN
  PRINT 20,'X=',X1!输出计算结果
ELSE
  PRINT 30,'经过',MAX,'次迭代后仍未收敛'
ENDIF
10 FORMAT('I=',I4,6X,'X=',F15.7)
20 FORMAT(A,F15.7,A)
30 FORMAT(A,I4,A)
END SUBROUTINE SOLVE
END MODULE NEWTON
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值