program B_Spline_Basis_Functions
implicit none
integer, parameter :: N = 10 ! 控制点数
integer, parameter :: K = 3 ! B样条阶数
real(8), parameter :: U(N+K+1) = (/0.0, 0.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0/) ! 节点矢量
real(8), parameter :: t = 4.5 ! 要计算基函数的位置
real(8) :: N_k(N, K) ! 存储所有K次基函数的值
! 计算K次B样条基函数
call Compute_B_Spline_Basis_Functions(N, K, U, t, N_k)
! 打印结果
write(*,*) "B样条基函数:"
do i = 1, N
write(*,*) "N_", i, "(", K, ")(", t, ") = ", N_k(i, K)
end do
contains
subroutine Compute_B_Spline_Basis_Functions(N, K, U, t, N_k)
integer, intent(in) :: N, K
real(8), intent(in) :: U(N+K+1)
real(8), intent(in) :: t
real(8), intent(out) :: N_k(N, K)
integer :: i, j
real(8) :: alpha, beta
! 计算0次B样条基函数
do i = 1, N
if (U(i) <= t .and. t < U(i + 1)) then
N_k(i, 0) = 1.0
else
N_k(i, 0) = 0.0
end if
end do
! 递推计算K次B样条基函数
do j = 1, K
do i = 1, N
alpha = 0.0
beta = 0.0
if (U(i+j) - U(i) > 0.0) then
alpha = (t - U(i)) / (U(i+j) - U(i))
end if
if (U(i+j+1) - U(i+1) > 0.0) then
beta = (U(i+j+1) - t) / (U(i+j+1) - U(i+1))
end if
N_k(i, j) = alpha * N_k(i, j-1) + beta * N_k(i+1, j-1)
end do
end do
end subroutine Compute_B_Spline_Basis_Functions
end program B_Spline_Basis_Functions