Задачи с экспоненциальным рядом Тейлора - PullRequest
0 голосов
/ 18 июня 2019

У меня проблемы с точным запуском этого кода, код компилируется правильно, но для каждого значения, введенного для входных данных, я всегда получу 1,0 в качестве ответа.

Ряд Тейлора для экспоненты начнется с одного по определению.Возможно, моя факторная реализация неверна, но любое редактирование факториального цикла отображает то, что кажется бесконечным циклом.

program taylor
    implicit none
    real :: inputexp, inputsine  ! The values of input for the arguments of the taylor series
    real :: exptaylor, sinetaylor ! The value of the sine and exponential calculated
    real :: expseries, sineseries ! The value found by the taylor series
    real, parameter :: accuracy = 1.e-10  ! The value of accuracy
    integer :: NN, aa, bb, cc, dd, ee, ff, gg, hh ! Loop indices and factorial things
    integer:: nfactexp ! Factorial for the exponential series
    integer :: Nexp ! Number of turns
    write(*,*) "Write the value of the input of the exponential taylor series"
    read(*,*) inputexp


    ! Calculating the exponential function using taylor series
     exptaylor = 1 ! Initializing the exponential function taylor arguemnts


    ! Loop to calculate the exponential function
    aa = 0
    do while(abs(exptaylor) > accuracy)

        ! Computing factorial
        nfactexp = 1 ! Accounting for 0!=1
        do bb = 1, aa
            nfactexp = nfactexp*bb
        enddo
        ! Evaluating the series
        aa = aa+1
        exptaylor = (inputexp**aa)/nfactexp
        expseries = exptaylor + expseries


        enddo

        Write(*,*) "The number of terms of the series, N", aa
        Write(*,*) "The value of the exponential according to the taylor series", expseries
    end program

1 Ответ

2 голосов
/ 18 июня 2019

У вас есть несколько проблем.

Прежде всего, вы не инициализируете expseries.Вы должны установить его до цикла.Прямо сейчас результат совершенно произвольный, поскольку начальное значение expseries не определено.

Во-вторых, ваша переменная nfactexp переполнена.32-разрядные целые числа, которые вы, вероятно, используете, допускают только числа до 2 147 483 647. Кроме того, (inputexp**aa) может переполниться.Хотя вы не можете исправить переполнения для всех входов, используя конечное количество битов, вы можете расширить вычисляемую область.Вычисляя каждый expterm с использованием последнего, как expterm = expterm / aa * inputexp, вы можете получить наибольший диапазон.

Вышеуказанное изменение также означает, что вы больше не будете избыточно вычислять факторные термины и уменьшать возведение в степень для умножения, что ускоряет выполнение кода.

Кроме того, abs в условии while -loop не требуется, поскольку expterm всегда неотрицателен.

См. кодниже:

program taylor
    implicit none
    real :: inputexp, exptaylor, expseries
    real, parameter :: accuracy = 1.0e-10
    integer :: aa

    write(*,*) "Write the value of the input of the exponential taylor series"
    read(*,*) inputexp

    exptaylor = 1  ! The first term is constant
    expseries = 1  ! The first term is already included
    aa = 0  ! Term index, i.e. 0 for the constant

    do while (exptaylor > accuracy)
        aa = aa + 1

        ! Use the previous value of exptaylor.
        ! Just scale it with the one more inputexp to get the x**n
        ! correct, and divide by aa for the factorial.
        exptaylor = exptaylor / aa * inputexp

        expseries = exptaylor + expseries
    enddo

    Write(*,*) "The number of terms of the series, N", aa
    Write(*,*) "The value of the exponential according to the taylor series", expseries
end program
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...