2016-02-22 8 views
2

Я должен рассчитать sin (x) с рядом Тейлора, пока выход не будет иметь 6 знаков после запятой. Аргумент - это угол. Я не выполнял проверку десятичных знаков, я просто печатаю следующие значения (чтобы проверить, работает ли он), но после 10-20 итераций он показывает бесконечности/NaN.Серия Тейлора - вычисление sin (x) до точности 6 цифр

Что не так в моих мыслях?

public static void sin(double x){ 
    double sin = 0; 
    int n=1; 
    while(1<2){ 

     sin += (Math.pow(-1,n)/factorial(2*n+1)) * Math.pow(x, 2*n+1); 
     n++; 

     try { 
      Thread.sleep(50); 
     } catch (InterruptedException ex) { 

     } 

     // CHECKING THE PRECISION HERE LATER 
     System.out.println(sin); 
    } 
} 

Уравнение:

enter image description here

+0

почему вы хотите это сделать? Может ли код быть численным приближением? Тогда ваш probaly проверяет ваши десятичные знаки, как вы заявили. – AlexWien

+0

В этом проблема. Задача: Реализовать метод sin (x), который вычисляет sin (x) с серией Тейлора с точностью до 6 цифр. << Вот и все, что у меня есть. Серия бесконечна, я думаю, что это «6 цифр» - это условие конца цикла. – Qbix

+0

И делает работа над кодом ?, вывести результат, входное значение и выход для каждой итерации. Является ли значение неправильным после первых 9 итераций? Может быть, 10 итераций много, и не писать формулы в одной строке, вы не можете их отлаживать, используйте переменную для каждого термина: например, double divisor = factorial (2 * n +1); Далее некоторые математические концепции не работают хорошо в компьютерных программах. Таким образом, вы, вероятно, получили некоторую информацию о том, как эта численность должна быть решена. – AlexWien

ответ

1

Не вычисляйте каждый термин, используя факториалы и мощности! Вы быстро переполнитесь. Просто понимаю, что каждый следующий член терм * х * х/((п + 1) * (п + 2)), где п увеличивается на 2 для каждого члена:

double tolerance = 0.0000007; // or whatever limit you want 
double sin = 0.; 
int n = 1; 
double term = x; 
while (Math.abs(term) > tolerance) { 
    sin += term; 
    term *= -((x/(n+1)) * (x/(n+2))); 
    n+= 2; 
} 
+0

sin (Math.PI) дает 3.14 Oo: D Ошибка где-то – Qbix

+0

должно быть Math.abs (term)> допуск – FredK

+0

@Qbix, если вы скопируете свое решение для своей домашней работы, подумайте об изменении уровня допустимого уровня. Вероятно, вы не можете ответить, почему он использовал 7 как последнюю цифру. будь моим первым вопросом, вам. – AlexWien

-1

Проблема:

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

Решение

Это происходит потому, что ваш факторный номер становится переполнение, а затем в какой-то момент вы Деление на ноль снова , если ваш факторный берется в качестве аргумента в INT, а затем изменить его, например, a BIgInterger объект.

+0

да, это правильно, после 10-20 итераций это становится огромным, но вывод 0-10 является случайным, поэтому я спрашиваю, что не так :( – Qbix

+0

Использование BIgInteger не является решением. Вероятно, автор должен реализовать «проверку десятичных знаков», как он заявил. – AlexWien

0

Чтобы добавить к ответу предоставленные @Xoce (и @FredK), помните, что вы вычисляете серию McLaurin (частный случай Тейлора около x = 0). Хотя это будет довольно быстро сходиться для значений, которые находятся в пределах pi/2 нуля, вы можете не получить конвергенцию цифр перед факториальными взрывами для значений x, кроме этого.

Моя рекомендация состоит в том, чтобы использовать фактический ряд Тейлора около ближайшего значения sin(x), для которого точного значение известно (то есть, ближайший кратна pi/2, а не только около нуля. И, безусловно, сделать проверку сходимости!