Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Вниз

Вычисление 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.051 c
2-1164576576
HighLighter
2006-11-27 00:29
2006.12.17
HighLighting


3-1160304756
Sanya_BBB
2006-10-08 14:52
2006.12.17
Как сделать выборку из таблицы без учета регистра букв


15-1164275079
Ганна Юхимівна
2006-11-23 12:44
2006.12.17
Turbo Delphi - собственный Object Inspector


15-1164350012
Zhekson
2006-11-24 09:33
2006.12.17
Чувствительность к регистру


15-1164614272
boriskb
2006-11-27 10:57
2006.12.17
История





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский