Расширение серии Тейлора для опыта (х) / греха (х) в Фортране - PullRequest
0 голосов
/ 28 марта 2012

Я пытался написать расширение ряда Тейлора для exp (x) / sin (x), используя fortran, но когда я протестировал свой инструмент для небольших чисел (N = 3 и X = 1.0) и добавил их вручную, результатыне соответствует тому, что я ожидаю.Вручную я подсчитал 4.444 .., а с помощью программы нашел 7.54113.Не могли бы вы проверить мой код и сказать мне, если я что-то не так.

Вот формула расширения для e ^ x / sin (x) в вольфрамальфе: http://www.wolframalpha.com/input/?i=e%5Ex%2Fsin%28x%29

 PROGRAM Taylor
 IMPLICIT NONE


 INTEGER ::Count1,Count2,N=3
 REAL:: X=1.0,Sum=0.0
 COMPLEX ::i=(0.0,0.1)
 INTEGER:: FACT

  DO Count1=1,N,1
    DO Count2=0,N,1
       Sum=Sum+EXP(i*X*(-1+2*Count1))*(X**Count2)/FACT(Count2)
    END DO

 END DO

 PRINT*,Sum

 END PROGRAM Taylor  

 INTEGER FUNCTION FACT(n)
   IMPLICIT NONE
   INTEGER, INTENT(IN) :: n
   INTEGER :: i, Ans
   Ans = 1
   DO i = 1, n
     Ans = Ans * i
   END DO
   FACT = Ans
END FUNCTION FACT

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Я не вижу сложных терминов в этом расширении Вольфрама, поэтому я удивляюсь, почему вы думаете, что вам нужно комплексное число в экспоненциальном выражении. И вы не можете получить этот 1 / x термин так, как вы его запрограммировали. Вам нужен где-то x ** (- 1.0).

Ваша факторная реализация также довольно наивна.

Я бы порекомендовал вам забыть о цикле и факториалах и начать с полинома, коэффициентов и метода Хорнера для оценки. Получите это, а затем посмотрите, сможете ли вы разобраться в цикле.

2 голосов
/ 28 марта 2012

В статье Вольфрама есть формула расширения, заданная с использованием q = e ** (ix), поэтому существует сложный термин. Поэтому «сумма» должна быть объявлена ​​комплексной.

Как уже говорилось, факториальная функция является упрощенной. Будьте осторожны с переполнением.

Лучше всего поместить ваши процедуры в модуль и «использовать» этот модуль из основной программы. Используйте как можно больше параметров отладки компилятора. Например, gfortran, когда используется соответствующая опция предупреждения, предупреждает о типе «sum»: «Warning: возможное изменение значения при преобразовании из COMPLEX (4) в REAL (4)». Если вы используете gfortran, попробуйте: -O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace

Поскольку вы можете решить эту проблему вручную, попробуйте вывести каждый шаг с помощью оператора записи и сравнить его с вычислением руки. Вероятно, вы быстро увидите, где расходятся расчеты. Если неясно, почему расчет отличается, разбейте его на части.

...