Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Как быть с arctan (арктангенсом)


Автор: Ярослав 30.5.2011, 13:45
Подскажите как вычислять арктангенс,арккосинус и арксинус у меня есть, в интернете нашёл по Алгоритму Тейлора, а вот в арктангенсе там ошибка и неправильно считает
private double MArctg(double x0) {
   int sp=0;
   double x,x2,y;
   x=x0;
   if(x<0) {x=-x;}
   if(x>1) {x=1.0/x;}
   //Уменьшаем интервал области аргумента
   while(x>0.2617993877991495) {
     sp++; //Вспомогательный счетчик шагов 
     x=(x*1.732050807569-1)/(x+1.732050807569);
   }
   //Вычисляем ряд Тейлора
     y=x;
     int n=1;
     double sn=x; 
     while (sn>1E-16){
             sn=sn*(2+1.0/n)*0.5*x*x;
             y=y+sn/(2*n+1)/(2*n+1); 
             n=n+1;
     }
         
   //Смещаем все на pi/6 необходимое число раз 
   y=y+sp*0.523598775598 
  
   if(x0>1) a=0.2617993877991495-a;
   if(x0<0) y=-y;
  
   return y;
 }
ПОМОГИТЕ РЕШИТЬ ПРОБЛЕМУ 
a-???????
x2-??????
ВЕСЬ ИНТЕРНЕТ В ЭТОЙ ПРОБЛЕМЕ

Автор: oxigen 30.5.2011, 17:07
Код

 if(x0>1) a=0.2617993877991495-a;

Что за 'a' тут вдруг появилась? Явно вместо нее 'y' должен быть.

Автор: Ярослав 30.5.2011, 17:42
Я тоже так думаю, х2 что это????  Даже если это и у результат не правельный

Автор: ivanovpv 31.5.2011, 07:24
Ряды Тейлора плохо подходят для аппроксимации спецфункций, они пригодны только для вычисления в малой окрестности. В реальных вычислениях обычно применяется аппроксимация полиномами Чебышева (возможны вариации и использование полиномов Якоби, Лежандра и проч. )

Погуглите - в сети исходников аппроксимации спецфункций ортогональными полиномами много.

Автор: vG874WbT5F 31.5.2011, 12:01
Нагуглил код:
Код

  public double arctan(double x) {
   if (Math.abs(x) == 1)return sgn(x) * Math.PI / 4;
   if (Math.abs(x) > 1)return sgn(x) * Math.PI / 2 - arctan(1 / x);
   double R = 0;
   for (int n = 0; n < 100; n++) R += pow( -1, n) * pow(x, 2 * n + 1) / (2 * n + 1);
   return R;
   }
 

   public byte sgn(double x) {
   if (x < 0)return -1;
   if (x == 0)return 0;
   return 1;
   }

   public double pow(double a, int b) {
   if (a == 0 && b == 0)return Double.NaN;
   if (b == 0)return 1;
   if (b == 1)return a;
   if (b == -1)return 1 / a;
   if (b < 0)return (1 / pow(a, -b));
   double R = 1;
   while (b != 0) {
   if (b % 2 != 0) R *= a;
   a *= a;
   b /= 2;
   }
   return R;
   }


Автор: Ярослав 31.5.2011, 15:14
Спасибо тема закрыта

Добавлено через 1 минуту и 24 секунды
Вот кому надо ответ на мой вапрос

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)