Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите реализовать функции tgx, sinx разложением в ряд Маклорена?
 
 автор: asked86   (13.02.2010 в 17:57)   письмо автору
 
 

Помогите реализовать функции tgx, sinx разложением в ряд Маклорена, стандартные функции sinx, cosx заложенные в языке нельзя?
Как реализовать на PHP, помогите пожалуйста?
В универе дали такое задание, нужно построить графики на PHP, и эти функции чтобы работали
но сам его реализовать не могу ....

  Ответить  
 
 автор: Trianon   (13.02.2010 в 20:05)   письмо автору
 
   для: asked86   (13.02.2010 в 17:57)
 

вот поглядите
http://softtime.ru/forum/read.php?id_forum=2&id_theme=70294
Там несовсем тот ряд, но как считается - видно

  Ответить  
 
 автор: asked86   (14.02.2010 в 10:57)   письмо автору
 
   для: Trianon   (13.02.2010 в 20:05)
 

Помогите реализовать данный ряд на PHP: S=x^3/3 - x^5/15 +...+(-1)^n+1 * (x^2n+1)/4n^2-1
У меня не получается, $e=0.000000001...... Это ряд Маклорена для tg

  Ответить  
 
 автор: Trianon   (14.02.2010 в 11:08)   письмо автору
 
   для: asked86   (14.02.2010 в 10:57)
 

показывайте код.
Поправим.


И сперва перепишите формулу суммы так, чтобы она соответствовала действительности.

  Ответить  
 
 автор: asked86   (14.02.2010 в 11:15)   письмо автору
 
   для: Trianon   (14.02.2010 в 11:08)
 

S=x^3/3 + x^5/15 -...+(-1)^n+1 * (x^2n+1)/4n^2-1
Условие не могу задать, это ряд Маклорена для tg?
              $e = 0.000001;.
              $x = вводим
              $S = 0;
              $a = $x;
              $n = 1;
    
          while (?) {
                $a =$a * $x * $x;
                $S = $S + $a/(4 * $n * $n - 1);
                $a = $a * -1;
                $n++;
            } 

  Ответить  
 
 автор: Trianon   (14.02.2010 в 11:23)   письмо автору
 
   для: asked86   (14.02.2010 в 11:15)
 

Это то, что Вы, не пытаясь вникнуть, слямзили с поста Fractured#


А по поводу этой строки. S=x^3/3 + x^5/15 -...+(-1)^n+1 * (x^2n+1)/4n^2-1

Как у Вас обозначено умножение?
какой приоритет операций?

Резюме. В каждой строке видно, что Вам чихать на эту задачу.
Просто интересно, почему тогда должно "не чихать" нам - отвечающим?

  Ответить  
 
 автор: asked86   (14.02.2010 в 11:34)   письмо автору
 
   для: Trianon   (14.02.2010 в 11:23)
 

->Это то, что Вы, не пытаясь вникнуть, слямзили с поста Fractured#
Не "слямзил" я посмотрел как там они задачу эту решали, и мне интересно стало что такая подобная задача когда то решалась. И взял отрывок кода оттуда. Чтобы колесо 100 раз не придумывать, и сейчас очень сильно интересно какое условие поставить чтобы программа заработала? Поймите меня правильно, мне интересно как можно ее реализовать/
->Просто интересно, почему тогда должно "не чихать" нам - отвечающим?
Поймите правильно меня, мне тяжеловать разбираться, с математикой есть проблемы. Я математику серьезно начал изучать 2 месяца назад. Все что успел пройти это дошел до тригонометрии 10 класса по учебнику Мордковича. Просто пока моих знаний здесь не хватает, поэтому и задал вопрос. А вообще решить эту задачу охото. Если Вам не сложно помогите разобраться, буду благодарен?

S=x^3/3 + x^5/15 -...+(-1)^n+1 * (x^2*n+1)/4*n^2-1

  Ответить  
 
 автор: Trianon   (14.02.2010 в 12:02)   письмо автору
 
   для: asked86   (14.02.2010 в 11:34)
 

x^2*n+1

Расставьте скобки в этом выражении

Собственно, условие очень простое.
Чтобы предыдущий результат отличался от последующего не более чем на эпсилон.
До некоторой степени можно будет ожидать, что не более чем станет и до точного значения.
На самом деле, всё несколько хитрее, но тогда (оценка погрешности, предел интеграла ошибки и т.д.) начнется уже настоящая математика, а не простейшая арифметика.

  Ответить  
 
 автор: asked86   (14.02.2010 в 12:44)   письмо автору
 
   для: Trianon   (14.02.2010 в 12:02)
 

Извините, тут что - то не правильно или что?
А как условие записать можно, просто в рядах не рублю вообще?
Чтобы предыдущий результат отличался от последующего не более чем на эпсилон. А в цикле этот результат у меня $S если я правильно понимаю да.

  $e = 0.000001;.
              $x = вводим
              $S = 0;
              $a = $x;
              $n = 1;
    
          while () {
                $a =$a * $x * $x;
                $S = $S + $a/(4 * $n * $n - 1);
                $a = $a * -1;
                $n++;
            } 

  Ответить  
 
 автор: Trianon   (14.02.2010 в 14:03)   письмо автору
 
   для: asked86   (14.02.2010 в 12:44)
 

Если хотите, могу показать Вам, как синус сделать.
С ним как-то более однозначно.

  Ответить  
 
 автор: asked86   (14.02.2010 в 14:15)   письмо автору
 
   для: Trianon   (14.02.2010 в 14:03)
 

Ну я не против, если можете то я только за!!!
А условие и у тангенса там одинаковое же будет или нет?

  Ответить  
 
 автор: Trianon   (14.02.2010 в 14:48)   письмо автору
 
   для: asked86   (14.02.2010 в 14:15)
 

Для тангенса Вы все еще не можете изобразить формулу суммирования.
Плюс к тому, то что Вы пытаетесь изобразить идет вразрез с рядом Маклорена тангенса - посмотреть его можете в той же википедии. Ряд там определен через число Белла, вычислять которые хотя и возможно, но как-то лениво.
В конце концов имея синус, остальное вычисляется влет через него. Надо лишь помнить об отрезке, на котором ряд сходится.

  Ответить  
 
 автор: asked86   (14.02.2010 в 14:55)   письмо автору
 
   для: Trianon   (14.02.2010 в 14:48)
 

А как синус вычисляется, у Вас есть решение?
в принципе если будет синус, можно найти и косинус, а потом записать tgx=sinx/cosx

  Ответить  
 
 автор: Trianon   (14.02.2010 в 14:57)   письмо автору
 
   для: asked86   (14.02.2010 в 14:55)
 

<?php
 $e 
0.000001;  $S $a $x 3.1415926/6;   $n 1;
  do{
                
$n+=2;
                
$a *= (- $x*$x)/(($n-1)*$n);
                
$S += $a;
       }while( 
abs($a) > $e );
echo 
$S;
?>

  Ответить  
 
 автор: asked86   (14.02.2010 в 16:02)   письмо автору
 
   для: Trianon   (14.02.2010 в 14:57)
 

Это ведь функция для вычисления синуса? Что - то вместо n ввожу допустим 30 он мне не тот результат выдает. А в калькуляторе синус 30 равен 0.5

  Ответить  
 
 автор: Trianon   (14.02.2010 в 16:06)   письмо автору
 
   для: asked86   (14.02.2010 в 16:02)
 

у меня в примере как раз и показано вычисление угла 30 градусов.
n менять не следует.
Следует вспомнить, в чем измеряют углы.

  Ответить  
 
 автор: asked86   (14.02.2010 в 16:58)   письмо автору
 
   для: Trianon   (14.02.2010 в 16:06)
 

Извини, все правильно вычисляет!
Я проверил потом отлично работает! Спасибо большое.
Можно спросить, а если tgx вычислять то так правильно:

   $x= 3.1415926/4;
        $e = 0.000001;

        $S = 0;
        $a = $x;
        $n = 1;       

   do 
   {
                $a = $a * $x * $x;
                $S = $S + $a/(4 * $n * $n - 1);
                $a = $a * -1;
                $n++;

              
       
    } while (abs($a)>$e);

       echo "".$S;




tg45 равен единице. А в этом коде вычисляет ни так, в чем проблема?

  Ответить  
 
 автор: Тень&   (14.02.2010 в 19:35)   письмо автору
 
   для: asked86   (14.02.2010 в 16:58)
 

> tg45 равен единице

Может наконец стоит понять, что "тангенс сорока пяти" и "тангенс сорока пяти градусов" -- вещи абсолютно разные? Это не зависит от того, что у тебя там в калькуляторе.

  Ответить  
 
 автор: Тень&   (14.02.2010 в 16:31)   письмо автору
 
   для: asked86   (14.02.2010 в 16:02)
 

> синус 30 равен 0.5

[поправлено модератором]

  Ответить  
 
 автор: asked86   (14.02.2010 в 17:03)   письмо автору
 
   для: Тень&   (14.02.2010 в 16:31)
 

проверь. и убедишься сам.

  Ответить  
 
 автор: Trianon   (14.02.2010 в 17:11)   письмо автору
 
   для: asked86   (14.02.2010 в 17:03)
 

Хватит лапшу вешать. Калькулятор чтоли трудно достать?
sin(30) приблизительно равен -0.988
tg(45) приблизительно равен 1.62

cos(a) = sin(a+Pi/2)

  Ответить  
 
 автор: asked86   (14.02.2010 в 17:27)   письмо автору
 
   для: Trianon   (14.02.2010 в 17:11)
 

Да нет все правильно, у меня прото в инженерном калькуляторе градусы стояли, а надо было радианы поставить.

  Ответить  
 
 автор: asked86   (14.02.2010 в 17:35)   письмо автору
 
   для: Trianon   (14.02.2010 в 17:11)
 

А как можно представить tgx ну принцип понятен, вот допустим если раскладен на ряды то получается:
x+1/3*x^3+2/15*x^5+17/315*x^7+62/2835*x^9 +...+..


Как его можно записать в цикле?

  Ответить  
 
 автор: Trianon   (14.02.2010 в 17:39)   письмо автору
 
   для: asked86   (14.02.2010 в 17:35)
 

Да также примерно.
Только нужно сперва написать вычисление тех самых чисел Белла, через которые ряд тангенса определен.

  Ответить  
 
 автор: asked86   (14.02.2010 в 17:42)   письмо автору
 
   для: Trianon   (14.02.2010 в 17:39)
 

Вот это по Тейлору в википедии формула есть:
x+1/3*x^3+2/15*x^5+17/315*x^7+62/2835*x^9 +...+..


Вот теперь в цикле не могу ее определить чтобы правильно вычисляла?

  Ответить  
 
 автор: Trianon   (14.02.2010 в 17:46)   письмо автору
 
   для: asked86   (14.02.2010 в 17:42)
 

там самое интересное в хвосте этой формулы, а не в середине.

  Ответить  
 
 автор: asked86   (14.02.2010 в 17:55)   письмо автору
 
   для: Trianon   (14.02.2010 в 17:46)
 

Ну тогда чтобы не парится, можно ведь вычислить косинус. А поскольку у нас есть синус можно найти и тангенс. Ведь tgx=sinx/cosx

В общем я вот так реализацию косинуса сделал, но не правильно вычисляет:

$e = 0.000000001;  $S = $a = $x = 3.1415926/6;   $n = 0;
  do{
                $n+=2;
                $a *= (- $x*$x)/($n*$n);
                $S += $a;
       }while( abs($a) > $e );
       
       $res = 1 - $S;
echo "cos = ". $res;

  Ответить  
 
 автор: Trianon   (14.02.2010 в 18:00)   письмо автору
 
   для: asked86   (14.02.2010 в 17:55)
 

> $res = 1 - $S;

cosX = 1 - sinX ? Это какой-то неведомый мне прорыв в науке.

  Ответить  
 
 автор: asked86   (14.02.2010 в 18:04)   письмо автору
 
   для: Trianon   (14.02.2010 в 18:00)
 

$res = 1 - $S;
Согласен, это лишнее я сам сейчас полез исправлять!
Но все равно результат не правильный выдает!.

  Ответить  
 
 автор: Trianon   (14.02.2010 в 18:05)   письмо автору
 
   для: asked86   (14.02.2010 в 18:04)
 

еще бы

  Ответить  
 
 автор: asked86   (14.02.2010 в 18:09)   письмо автору
 
   для: Trianon   (14.02.2010 в 18:05)
 

Trianon Видите у меня в условии задачи написано, нельзя использовать тригонометрические функции. Тут только тогда мне писать функцию для вычисления cosx надо.
Я ее написал, а она не работает. Вернее вычисляет не правильно.

$e = 0.000000001;  $S = $a = $x = 3.1415926/6;   $n = 0;
  do{
                $n+=2;
                $a *= (- $x*$x)/($n*$n);
                $S += $a;
       }while( abs($a) > $e );
       
    
echo "cos = ". $S;

  Ответить  
 
 автор: Trianon   (14.02.2010 в 18:14)   письмо автору
 
   для: asked86   (14.02.2010 в 18:09)
 

вижу.
Вижу также и то, что Вы не разобрались, как этот, не такой уж сложный в сущности, цикл работает. Иначе бы написали всё корректно.

Хотя для того чтоб вычислить косинус через синус смещенного аргумента, даже и это не требуется.


От меня-то Вы что хотите?
Второго халявного примера не будет.

  Ответить  
 
 автор: asked86   (14.02.2010 в 18:16)   письмо автору
 
   для: Trianon   (14.02.2010 в 18:05)
 

Вот косинус нашли. Теперь можно легко tgx=sinx/cosx
Проверьте так?

$e = 0.00000001;  $S = $a = $x = 3.1415926/6;   $n = 1;
  do{
                $n+=2;
                $a *= (- $x*$x)/(($n-1)*$n);
                $S += $a;
       }while( abs($a) > $e );
echo $S."<br>"; 

$sin=$S
$cos = sqrt(1 - $S*$S); 

$tgx= $sinx/$cosx;

echo "tgx = ".$tgx;

  Ответить  
 
 автор: Trianon   (14.02.2010 в 18:20)   письмо автору
 
   для: asked86   (14.02.2010 в 18:16)
 

для положительных косинусов - возможно. Для отрицательных - враки.
но Вы применили корень - его можно применять?

  Ответить  
 
 автор: asked86   (14.02.2010 в 18:46)   письмо автору
 
   для: Trianon   (14.02.2010 в 18:20)
 

->но Вы применили корень - его можно применять?
А что, Вы считаете что это не правильно, во всяком случае положительные значения будут вычислены.
А если внутри корня взять по модулю а потом вычислить корень?
$cos = sqrt(abs(1 - $S*$S));

А там смотреть если $S отрицательное то поставим мнус после вычисления.

  Ответить  
 
 автор: Trianon   (14.02.2010 в 18:50)   письмо автору
 
   для: asked86   (14.02.2010 в 18:46)
 

>->но Вы применили корень - его можно применять?
>А что, Вы считаете что это не правильно,

При чем тут я.
sqrt - стандартная функция, а Вы сказали, что на них наложено табу.
По условиям задачи.

  Ответить  
 
 автор: Trianon   (14.02.2010 в 18:54)   письмо автору
 
   для: Trianon   (14.02.2010 в 18:50)
 

утомили Вы меня.
<?php
 $e 
0.0000001;  $S $a 1$x 3.1415926/3;   $n 0;
  do{
                
$n+=2;
                
$a *= (- $x*$x)/(($n-1)*$n);
                
$S += $a;
       }while( 
abs($a) > $e );
echo 
$S;
?>

  Ответить  
 
 автор: asked86   (14.02.2010 в 19:45)   письмо автору
 
   для: Trianon   (14.02.2010 в 18:54)
 

Сейчас вычислил: просто как отношение сделал и все.

  Ответить  
 
 автор: Trianon   (14.02.2010 в 18:11)   письмо автору
 
   для: Trianon   (14.02.2010 в 17:39)
 

пардон.
Числа Бернулли, а не Белла.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования