fortran中编写Newton-Raphson迭代法求解5组方程5个未知数的代码
时间: 2024-01-22 13:19:07 浏览: 274
下面是Fortran中编写Newton-Raphson迭代法求解5组方程5个未知数的代码:
```
program newton_raphson
implicit none
integer, parameter :: n = 5 ! 未知数的个数
real, parameter :: eps = 1e-6 ! 精度
real, parameter :: max_iter = 100 ! 最大迭代次数
real :: x(n) ! 初始解向量
real :: f(n) ! 函数值向量
real :: j(n,n) ! 雅可比矩阵
real :: dx(n) ! 解的增量向量
integer :: iter ! 迭代次数
! 初始化初始解向量
x = [1.0, 1.0, 1.0, 1.0, 1.0]
do iter = 1, max_iter
! 计算函数值向量和雅可比矩阵
call calc_f_j(x, f, j)
! 解线性方程组 J * dx = -f
call solve_linear_equations(j, -f, dx)
! 更新解向量
x = x + dx
! 判断是否达到精度要求
if (maxval(abs(dx)) < eps) then
exit
end if
end do
! 输出结果
write(*,*) "迭代次数 = ", iter
write(*,*) "解向量 = ", x
contains
subroutine calc_f_j(x, f, j)
! 计算函数值向量和雅可比矩阵
implicit none
real, intent(in) :: x(n) ! 当前解向量
real, intent(out) :: f(n) ! 函数值向量
real, intent(out) :: j(n,n) ! 雅可比矩阵
! 计算函数值向量
f(1) = x(1) + x(2)**2 - 2
f(2) = x(1) * x(2) - x(3) - 1
f(3) = x(4) - x(5)**2 + 1
f(4) = exp(x(1) - 1) + x(5) - x(2) - x(4) + 2
f(5) = 1 / (1 + x(3)**2) - x(1) + x(4) - 1
! 计算雅可比矩阵
j(1,1) = 1
j(1,2) = 2 * x(2)
j(1,3) = 0
j(1,4) = 0
j(1,5) = 0
j(2,1) = x(2)
j(2,2) = x(1)
j(2,3) = -1
j(2,4) = 0
j(2,5) = 0
j(3,1) = 0
j(3,2) = 0
j(3,3) = 0
j(3,4) = 1
j(3,5) = -2 * x(5)
j(4,1) = exp(x(1) - 1)
j(4,2) = -1
j(4,3) = 0
j(4,4) = -1
j(4,5) = 1
j(5,1) = -1
j(5,2) = 0
j(5,3) = -2 * x(3) / (1 + x(3)**2)**2
j(5,4) = 1
j(5,5) = 0
end subroutine calc_f_j
subroutine solve_linear_equations(a, b, x)
! 解线性方程组 a * x = b
implicit none
real, intent(in) :: a(n,n) ! 系数矩阵
real, intent(in) :: b(n) ! 右端向量
real, intent(out) :: x(n) ! 解向量
integer :: ipiv(n) ! 偏置矩阵
integer :: info ! LAPACK函数调用返回值
x = b ! 初始化解向量
call sgesv(n, 1, a, n, ipiv, x, n, info) ! 调用LAPACK函数sgesv解线性方程组
if (info /= 0) then
write(*,*) "线性方程组求解失败!"
stop
end if
end subroutine solve_linear_equations
end program newton_raphson
```
在这个程序中,我们定义了一个`calc_f_j`子程序来计算函数值向量和雅可比矩阵,以及一个`solve_linear_equations`子程序来解线性方程组。主程序中使用Newton-Raphson迭代法求解方程组,并输出结果。
阅读全文