我最近遇到了一个我从未听说过的术语“函数向量”。我需要定义一个“函数向量”来解决非线性代数方程组。 《数字食谱》中有一个名为“ newt”的例程。在C ++中,数值食谱为我定义了一类新的函数向量,因此我要做的就是使用提供的库调用nr3.h。有人知道如何在Fortran90 / 95/03/08中执行此操作(这些标准中的任何一项都对我有效)?我想知道,因为我不精通C ++,所以我宁愿在Fortran中工作。
C ++的代码可以在这里找到: http://numerical.recipes/forum/showthread.php?t=1703&highlight=403
在代码中注意函数“ VecDoub y(3)”。这不是C ++固有的(我不认为)。但是,由于C ++中可以定义新类,因此VecDoub是在C ++中定义的。有没有办法在Fortran中做到这一点?
谢谢。
答案 0 :(得分:1)
正如@Peter在评论中所说,“功能向量”没有什么特别之处。 VecDoub
只不过是常规的double向量,而vecfunc
实际上是向量的函数。那么,newt
只是一个接受向量和向量函数的过程。
fortran中最接近的等效项是这样的:
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