На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Fortran: ATAN
      Перевожу код с фортрана на дельфи , застрял на операторе ATAN. Както странно он работает по сравнению с его аналагом на дельфи.

      на фортране
      ExpandedWrap disabled
        SUBROUTINE CTL(UCF,U,RO,AL1,B2,FI,PSI,C1,W1,C2,W2B1,AL2,HO,POL)
        CF=U/UCF
        C1=FI*CF*SQRT(1-RO)
        CALL TRK(C1,U,AL1,C1U,W1,B1)
        W2=PSI*SQRT(W1**2+RO*CF**2)
        CALL TRK(W2,U,B2,W2U,C2,AL2)
        HO=(CF**2)/2.
        POL=U*(C1U+W2U-U)/HO
        RETURN
        END
         
        Subroutine TRK (C,U,A,CU,W,B)
        PI=3.141593
        CU=C*COS(A)
        CA=C*SIN(A)
        UC=CU-U
        B1=ATAN(UC/CA)
        B=PI/2.-B1
        W=SQRT(UC**2+CA**2)
        RETURN
        END


      на дельфи
      ExpandedWrap disabled
        procedure TForm1.CTL(VAR UCF,U,RO,AL1,B2,FI,PSI,C1,W1,C2,W2,B1a,AL2,HO,POL:REAL);
         
        begin
        CF:=U/UCF ;
        C1:=FI*CF*SQRT(1-RO) ;
        TRK(C1,U,AL1,C1U,W1,B1a) ;
        W2:=PSI*SQRT(POWER(W1,2)+RO*POWER(CF,2)) ;
        TRK (W2,U,B2,W2U,C2,AL2)    ;
        HO:=(POWER(CF,2))/2 ;
        POL:=U*(C1U+W2U-U)/HO ;
        end;
         
         
        procedure TForm1.TRK(VAR C,U,A,CU,W,B:REAL);
        begin
         
         CU:=C*COS(pi/(180/a)) ;
         CA:=C*SIN(pi/(180/a)) ;
         UC:=CU-U ;
         BTRK:=arctan(pi/(180/(UC/CA))) ;
          B:=PI/2.-BTRK    ;
        W:=SQRT(POWER(UC,2)+POWER(CA,2)) ;
        end;


      данные

      исходные:
      ucf:=0.509 ;
      u:=135.9 ;
      b2:=20 ;
      fi:= 0.969 ;
      psi:= 0.943 ;
      ro:= 0.169 ;
      al1:= 12.9 ;

      должен получится вот такой ответ:
      с1=235
      w1=107.5
      b1=29,3 (не сходитcя из-за арктангенса ,получается 1,06 )
      w2=144,9
      al2=89,7 (тоже не сходится ,получается 0,0077)
      c2=49,6
      pol=0,87
      ho=35642

      прошу помочь с не навистными арктангенсами :scratch:
        Не понял. Ты угол что, в градусах задаешь, когда в Дельфи программу гоняешь? Почему понадобился перевод в радианы там, где в оригинале его не было?
          Цитата volvo877 @
          Не понял. Ты угол что, в градусах задаешь, когда в Дельфи программу гоняешь? Почему понадобился перевод в радианы там, где в оригинале его не было?

          Это уж не говоря о том, что и перевод в радианы (даже если он был бы зачем-то нужен) попросту выполнен неправильно. :D
            Цитата volvo877 @
            Не понял. Ты угол что, в градусах задаешь, когда в Дельфи программу гоняешь? Почему понадобился перевод в радианы там, где в оригинале его не было?

            AL1,B2- даются в градусах

            Думаю здесь он точно нужен (без него весь ответ неправельный)
            ExpandedWrap disabled
               CU:=C*COS(pi/(180/a)) ;
               CA:=C*SIN(pi/(180/a)) ;


            но я что-то явно делаю не так вот здесь
            ExpandedWrap disabled
               BTRK:=arctan(pi/(180/(UC/CA))) ;
                B:=PI/2.-BTRK    ;
              Цитата RealZ @
              AL1,B2- даются в градусах
              Значит, у тебя фортран считает неправильно. Если угол - в градусах, то SIND/COSD... А используются обычные SIN/COS... Неувязочка...

              P.S. Для перевода градусы -> радианы есть Math.DegToRad, если что...
              Сообщение отредактировано: volvo877 -
                Цитата volvo877 @
                Цитата RealZ @
                AL1,B2- даются в градусах
                Значит, у тебя фортран считает неправильно. Если угол - в градусах, то SIND/COSD... А используются обычные SIN/COS... Неувязочка...

                P.S. Для перевода градусы -> радианы есть Math.DegToRad, если что...

                спасибо :good:
                это навело меня на мысли что надо сделать вот так :
                ExpandedWrap disabled
                   CU:=C*COS(Math.DegToRad(a)) ;
                   CA:=C*SIN(Math.DegToRad(a));
                   UC:=CU-U ;
                   BTRK:=Math.radtodeg(arctan(UC/CA)) ;

                и всё сошлось
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0261 ]   [ 16 queries used ]   [ Generated: 29.03.24, 12:12 GMT ]