Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.17;
Скачать: CL | DM;

Вниз

Вычисление SIN, как еще можно сделать?   Найти похожие ветки 

 
TauRus ©   (2006-11-23 11:35) [0]

Нужны еще варианты вычисления sin(x)... и есть еще ли попроще?

Вот пример из книги нашего преподавателя...

"Примером использования цикла repeat служит программа вычисления функции sin(x). Функция вычисляется с помощью разложения ее в ряд вида: sin(x)=x1/1! - x3/3! + x5/5! - x7/7! - ... (количество суммируемых членов ряда определяется точностью – e). В процессе вычисления очередной член (pi) определяется по формуле pi= - pi=1 * x2 /(I * (I - 1)). При этом учитывается, что члены ряда индексируются с шагом 2, т.е. i=1,3,5, … , и в качестве начальных установок используются i :=3, s :=x, p :=x, x2 :=x*x. Перменная s является “накопителем” текущей суммы членов ряда, а условием окончания процесса является проверка вида “очередной член по абсолютной величине меньше заданной точности”, т. е. кpi к< e.
Применение цикла repeat в этом случае полностью оправдано, так как цикл обеспечивает окончание повторений по условию, которое не является явной функцией счета, и позволяет ввести параметр цикла, который изменяется с шагом, отличным от единицы."

Program Func_sin_1;
var
I : Integer;
E,X,P,S : Real;
begin
Write (‘Введите аргумент функции Sin(x), x= ’);
ReadLn (X);
Write (‘Введите точность e=’);
ReadLn (E);
S :=X;
P :=X;
X2 :=X*X;
I :=3;
repeat
P :=-P*X2/(I*(I-1));
S :=S+P;
I:=I+2
until Abs(P)<E;
WriteLn (’Sin (’, X, ’) = ‘, S)
end.

и такой еще вариант:

program Func_sin_2;
var
I : Integer;
E,X,p,S : Real;
begin
Write (‘Введите аргумент функции Sin(x), х= ’);
ReadLn (X);
Write (‘Введите точность e= ’);
ReadLn (E);
S :=X;
p :=X;
X2 :=X*X;
i :=3;
while abS(P)> E do
begin
P :=-P*X2/(I*(I-1));
S :=S+P;
I :=I+2
end;
WriteLn (’Sin(’,x,’) = ‘,S)
end.


 
Думкин ©   (2006-11-23 11:38) [1]

Можно еще через косинус или экспоненты. Или через FOR.


 
Ega23 ©   (2006-11-23 11:38) [2]

Чем отличается While от Repeat ?
Это автору вопрос.


 
TauRus ©   (2006-11-23 11:41) [3]

Оператор while по сути  мало чем отличается от repeat, если не принимать во внимание то, что это цикл с предусловием. Его конструкция имеет вид:
<оператор while>               ::=  while  <условие >  do <оператор >


 
Чапаев ©   (2006-11-23 11:41) [4]

> Или через FOR
Так ведь количество итераций неизвестно.


 
Чапаев ©   (2006-11-23 11:43) [5]

> [0] TauRus ©   (23.11.06 11:35)
Хе... Киев, 27 лет... Уж не заочник ли КПИ, ФИВТ? :-D


 
TauRus ©   (2006-11-23 11:43) [6]


> Думкин ©  


пример если можно сможеш сделать?

всем:
и если не через ряд делать как еще можно?


 
Думкин ©   (2006-11-23 11:44) [7]

> Чапаев ©   (23.11.06 11:41) [4]

Можно прикинуть. Член же явно выписан. А мы на его величину ориентируемся.


 
Чапаев ©   (2006-11-23 11:44) [8]

> [5] Чапаев ©   (23.11.06 11:43)
А то уж больно знакомый стиль "нашего преподавателя"... :-D


 
TauRus ©   (2006-11-23 11:44) [9]

ага..:)


 
Курдль ©   (2006-11-23 11:44) [10]

Самое быстрое и простое вычисление - табличное.
Но надо расчитать требуемую точность и прикинуть, устраивают ли тебя накладные расходы (занимаемая таблицей память)?


 
TauRus ©   (2006-11-23 11:45) [11]

просто я немогу ничего пока придумать


 
Чапаев ©   (2006-11-23 11:45) [12]

> [7] Думкин ©   (23.11.06 11:44)
В принципе, конечно, можно... Но, как по мне, это уже "искусство для искусства" (в данном конкретном случае).


 
Чапаев ©   (2006-11-23 11:45) [13]

> [11] TauRus ©   (23.11.06 11:45)
Хе-хе... Олегу Владимировичу привет... ;-)


 
TauRus ©   (2006-11-23 11:46) [14]

хм.. а вариант если можно...на паскале...


 
Думкин ©   (2006-11-23 11:46) [15]

> TauRus ©   (23.11.06 11:43) [6]

1. Не хочу.
2. Если не через ряд -
а. используя функцию станартную
б. через тригонометрические формулы - а значения иных - как-нить.
в. взяв интеграл
г. .....


 
TauRus ©   (2006-11-23 11:46) [16]


> Хе-хе... Олегу Владимировичу привет... ;-)


оки


 
Думкин ©   (2006-11-23 11:47) [17]


> TauRus ©   (23.11.06 11:44) [9]

А, заочник. Тогда ладно. Я думал школьник или студент. Извини.


 
TauRus ©   (2006-11-23 11:48) [18]


> А, заочник. Тогда ладно. Я думал школьник или студент. Извини.


за что извинять? не, ну серьйозно... что еще можно прыдумать?


 
palva ©   (2006-11-23 11:50) [19]

Для вычисления синуса есть специальная команда сопроцессора.
На машинах, где нет такой команды имеются стандартные подпрограммы, которые обычно работают по следующему алгоритму: используя периодичность и симметрию сводим вычисление к вычислению синуса на отрезке [0, pi/2], а для этого отрезка используем "многочлен наилучшего приближения"


 
Alien1769 ©   (2006-11-23 12:10) [20]


> > [5] Чапаев ©   (23.11.06 11:43)
> А то уж больно знакомый стиль "нашего преподавателя"...
> :-D

Чапай давно закончил КПИ ?
Тебе тоже давали такие заумные задания по курсовым,
а то мне стиль решения задач преподавателей уже достал.


 
Чапаев ©   (2006-11-23 12:23) [21]

> [19] palva ©   (23.11.06 11:50)
Вот что удивляет... Все книжки по математике твердят, что вышеприведенный ряд сходится на интервале от минус-бесконечность до плюс-бесконечность. А программисты (преподаватели, по крайней мере) требуют приведения к интервалу [-Pi;Pi).


 
Чапаев ©   (2006-11-23 12:24) [22]

> [20] Alien1769 ©   (23.11.06 12:10)
Полтора года. Это не курсовая, а лабораторка первого курса. Просто преподаватель требует/советует написать десятка три вариантов вычисления синуса, к примеру, а потом уже указать, какой из вариантов лучший и почему.


 
TauRus ©   (2006-11-23 12:25) [23]

вот знашел чтото... незнаю подойдет ли...но врядли проще :(


 
Думкин ©   (2006-11-23 12:26) [24]

> Чапаев ©   (23.11.06 12:23) [21]

Не книжки, а следствия из соответсвующих теорем. :)

Посчитай при x=50, когда у тебя начнет главный член уменьшаться?


 
Romkin ©   (2006-11-23 12:26) [25]

На практике вычисляют через ряд чаще всего. Вот только не через repeat, а через for :)
Удобно: ряд быстро сходится, когда аргументв пределах от 0 до Pi/4, а его всегда можно привести к этому интервалу. Второй пункт: точность фиксирована, и равна минимальному разряду. Третий вывод: рассчитываем максимальное количество членов ряда, необходимое для достижения данной точности, при условии, что аргумент находится в указанном интервале, и просто даем цикл с фиксированным числом шагов ;)


 
Думкин ©   (2006-11-23 12:26) [26]


> десятка три вариантов вычисления синуса

ужс.


 
TauRus ©   (2006-11-23 12:27) [27]

хотя... врядли...блин мне sin(x) нуна а не sin(x)=а


 
TauRus ©   (2006-11-23 12:27) [28]

во...ужас...


 
Чапаев ©   (2006-11-23 12:29) [29]

> [24] Думкин ©   (23.11.06 12:26)
Ради эксперимента на том же первом курсе считат синус от сотни. Было на две итерации больше, чем после приведения к интервалу.


 
Думкин ©   (2006-11-23 12:31) [30]


> Чапаев ©   (23.11.06 12:29) [29]

Это какие-то неправильные итерации.


 
Чапаев ©   (2006-11-23 12:31) [31]

Ну и ладно! На первом курсе деревья были большие, а итерации маленькие... :о)


 
Чапаев ©   (2006-11-23 12:39) [32]

Действительно сбрехнул. Только что считал sin(100), e=0.001 -- 137 итераций.


 
TauRus ©   (2006-11-23 12:44) [33]


> Чапаев ©  


как считал?


 
Чапаев ©   (2006-11-23 12:49) [34]

По второй из приведенных тобой программ.


 
Jeer ©   (2006-11-23 13:06) [35]

Sin функция м.б. определена как:
- решение дифф.ур-ний
- степенные ряды
- решение функц.ур-ний

В частности:
-степенные разложения (Тейлор, Маклорен,..);
-бесконечные произведения;
-многочленные приближения(Якоби, Лежандра, Чебышева..);
-рациональные приближения(теорема Чебышева, аппроксимация Паде,..);
-разложение в цепные дроби(решение дифф-ур в виде цепной дроби..);
-итеративные процессы(Чебышев, метод Доморяда, реккурентые соотношения, методы "цифра за цифрой", метод Волдера..);


 
Jeer ©   (2006-11-23 13:53) [36]

Вот простейшая реализация на "пятичленном" (сам испугался, когда представил)
ряде по схеме Горнера:

// Sin: x = [0-0.5],   PI*x [rad]
function Sin5_(x: double): double;
const
 A1: double =  3.140625;
 A2: double =  0.02026367;
 A3: double = -5.325196;
 A4: double =  0.05446778;
 A5: double =  1.800293;
begin
 Result := x*(A1+x*(A2+x*(A3+x*(A4+x*A5))));
end;


 
TauRus ©   (2006-11-23 14:46) [37]

Jeer ©  
математик?
я б долго думал...


 
Alien1769 ©   (2006-11-23 14:54) [38]


> Jeer ©  
> математик?
> я б долго думал...

Опыт приходит с годами.


 
Jeer ©   (2006-11-23 14:54) [39]


> TauRus ©   (23.11.06 14:46) [37]



> математик?


Нет, но могу - "нас этому учили" :)


 
Real ©   (2006-11-24 13:51) [40]


> TauRus

Самый простой вариант - использовать готовую функцию sin(x) ;)



Страницы: 1 2 вся ветка

Текущий архив: 2006.12.17;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.039 c
2-1164689108
Silica
2006-11-28 07:45
2006.12.17
Рисование многоугольников в Delphi


2-1164964269
Cobra
2006-12-01 12:11
2006.12.17
Моя форма непрямоугольная


3-1160046075
Shade__
2006-10-05 15:01
2006.12.17
Коннект к MySQL через прокси


2-1164645290
Okey
2006-11-27 19:34
2006.12.17
String to PChar <>


1-1162547389
Dmitry_177
2006-11-03 12:49
2006.12.17
Удалить первые n-байт из файла