Как сказал @Peter в комментарии, в этом "векторе функций" нет ничего особенного.VecDoub
немного больше, чем регулярный вектор двойников, а vecfunc
на самом деле является функцией векторов.Тогда newt
- это просто процедура, которая принимает вектор и функцию векторов.
Ближайший эквивалент в фортране будет выглядеть примерно так:
program vector_functions
implicit none
logical :: check
integer :: i
double precision :: x(3) = [0, 5, 7], y(3)
print *, 'Initial guess: ', x
print *, 'Calling newt...'
call newt(x, check, vecfunc)
if(check) then
print *, 'Check is true (convergence to a local minimum).'
print *, 'Try another initial guess.'
else
print *, 'Check is false (a \"normal\" return).'
end if
print *, 'Solution from newt: ', x
y = vecfunc(x)
print *, 'Value of the solution vector: ', y
contains
function vecfunc(x) result(y)
double precision, intent(in) :: x(:)
double precision :: y(size(x))
y(1) = x(1) * x(2) * x(3) - 6
y(2) = x(1) * x(1) * x(2) + x(2) * x(2) * x(3) + x(3) * x(3) * x(1) - 23
y(3) = exp(x(1) + x(2) + x(3)) - 403
end
subroutine newt(x, check, f)
double precision, intent(inout) :: x(:)
logical, intent(out) :: check
interface
function f(a)
double precision, intent(in) :: a(:)
double precision :: f(size(a))
end
end interface
! custom implementation of newt here...
end
end