Ряд Тейлора для греха (x) в Java

Я пытаюсь построить программу, которая вычисляет ряд Тейлора для греха (х). С x больше 0 и меньше чем pi/2 (я пытался писать латексом, но не получилось (??)) . Аппроксимация sin (x) находится вокруг точки x0 = 0. e - максимальная ошибка (или неточность... я не знаю, как она называется). Ошибка (или неточность) вычисляется по формуле в методе, который я называю r. Так что г всегда должно быть меньше е. Наконец, n - это число итераций. Ниже приведена моя программа, она работает без ошибок, но я получаю неточные результаты, и я не знаю, что я делаю неправильно (возможно, мы должны принять во внимание возможность использования формулы с ошибками).

import java.lang.Math;
import java.util.Scanner;

public class hw74 { 
    public static long factorial(int number) {
        long result = 1;

        for (int factor = 2; factor <= number; factor++) {
            result *= factor;
        }

        return result;
    }

    static double p(double x, double x0, int n) {
        double PT = Math.pow(-1, n) * (Math.pow(x-x0, 2*n+1)/factorial(2*n+1));
        return PT;
    }

    static double r(double x, int n) {
        double rn = Math.pow(x, n+1)/factorial(n+1);
        return Math.abs(rn);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double x0 = 0;
        System.out.println("Give x. ");
        double x = sc.nextDouble();
        System.out.println("Give E. ");
        double e = sc.nextDouble();
        System.out.println("Give N. ");
        int n = sc.nextInt();
        int i = 0;
        //System.out.println(e<r(x, i) && i<n);
        //System.out.println(r(x, i));
        while((r(x, i)<e) && i<n) {
            i++;
            System.out.println("N is : "+i);
            System.out.println("P is : "+p(x,x0,n));
            System.out.println("E is : "+r(x,n));
        }
    }   
}

Например: для n = 5, e = 1 и x=pi/5 (0,62831853071) результаты должны быть следующими: sin(pi/5) = 0,5877852522... Для n = 1 r = 0,1974, n=2 r=0,0413, n=3 r=0,0065, n=4 r=8,16*10^(-4), n=5 r=8,54*10^(-5)

2 ответа

Решение

Мы аппроксимируем ряд Тейлора (сумму) полиномом Тейлора. Метод p в вашей программе вычисляется только один член в этом многочлене, поэтому вам просто нужно сложить последовательность от 0 до N, например:

static double sum(double x, double x0, int n) {
    double sum = 0;
    for (int i = 0; i <= n; ++i) {
        sum += p(x, x0, i);
    }
    return sum;
}

Другими словами, это часть, обозначенная символом ∑.

редактировать: глядя на вашу логику в main, может быть, вы уже пытаетесь сделать что-то подобное, но я не уверен. Я думаю, что вы, вероятно, должны вернуться к этому тоже.

Двойной тип с плавающей запятой и этот способ не точен. Вместо этого используйте BigDecimal. Смотрите этот ответ для получения дополнительной информации.

Другие вопросы по тегам