2

如何在Fortran中验证非线性系统的迭代公式是否会收敛到附近的根(x,y)

支持符号计算的编程语言很容易。但是如何在 Fortran 中做到这一点?就像获取组件函数的偏导数并检查它们是否在根附近有界。但我不能在 fortran 中做到这一点,或者不知道如何做到这一点。如果有人现在给我一些关于以下非线性系统的想法,或者如果可能的话,这对我来说将是一个很大的帮助。

我想在这种情况下使用定点迭代方法

主要系统:

x^2+y=7
x-y^2=4

迭代形式(给定):

X(n+1)=\sqrt(7-Y(n)),
Y(n+1)=-\sqrt(X(n)-4),
(x0,y0)=(4.4,1.0)

定理(我遵循)

图片

问题是,我需要检查(x0,y0)=(4.4,1.0) 周围某个区域的偏导数\sqrt(7-Y)的有界性。-\sqrt(X-4)我可以在 fortran 中编写偏导函数,但是如何评估这么多值并检查它是否在(4.4,1.0).

更新

一种可能正确的解决方案是获取(4.4,1.0)类似的值数组(4.4-h,1.0-h)*(4.4+h,1.0+h)并评估定义的偏导函数并近似它们的有界性。我在 Fortran 中没有遇到过这样的问题,所以任何关于这方面的建议也可以帮助我很多。

4

2 回答 2

0

如果您只想检查网格上函数的有界性,您可以执行类似的操作

program verify_convergence
  implicit none
  
  integer, parameter :: dp = selected_real_kind(15, 307)
  
  real(dp) :: centre_point(2)
  real(dp) :: step_size(2)
  integer :: no_steps(2)
  real(dp) :: point(2)
  real(dp) :: derivative(2)
  real(dp) :: threshold
  
  integer :: i,j
  real(dp) :: x,y
  
  ! Set fixed parameters
  centre_point = [4.4_dp, 1.0_dp]
  step_size = [0.1_dp, 0.1_dp]
  no_steps = [10, 10]
  threshold = 0.1_dp
  
  ! Loop over a 2-D grid of points around the centre point
  do i=-no_steps(1),no_steps(1)
    do j=-no_steps(2),no_steps(2)
      ! Generate the point, calculate the derivative at that point,
      !    and stop with a message if the derivative is not bounded.
      point = centre_point + [i*step_size(1), j*step_size(2)]
      derivative = calculate_derivative(point)
      if (any(abs(derivative)>threshold)) then
        write(*,*) 'Derivative not bounded'
        stop
      endif
    enddo
  enddo
  
  write(*,*) 'Derivative bounded'
contains
  
  ! Takes a co-ordinate, and returns the derivative.
  ! Replace this with whatever function you actually need.
  function calculate_derivative(point) result(output)
    real(dp), intent(in) :: point(2)
    real(dp) :: output(2)
    
    output = [sqrt(7-point(2)), -sqrt(point(1)-4)]
  end function
end program

我知道该功能calculate_derivative不能满足您的要求,但我不确定您真正想要的功能是什么。只需根据需要替换此功能即可。

于 2021-10-16T12:14:06.997 回答
-1

主要问题不同:如何在没有任何软件帮助的情况下计算数学问题的解?如果您知道这一点,我们可以用 fortran 或任何语言对其进行编程。

特别是,假设 n=0,1,2,3... 要解决您的问题,您需要知道 X(0) 和 Y(0)。有了这个你计算

X(1)=\sqrt(7-Y(0)), Y(1)=-\sqrt(X(0)-4)

现在你知道了 X(1) 和 Y(1),那么你可以计算

X(2)=\sqrt(7-Y(1)), Y(2)=-\sqrt(X(1)-4)

等等

如果你的方程组收敛到某个东西,直到一些迭代(例如,n = 10、20、100)你去检查。但是由于fortran的性质,它不会以象征性的方式为您提供解决方案,这不是它的目标。

于 2021-10-15T17:09:26.973 回答