Форум: "Прочее";
Текущий архив: 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) ;)
← →
Jeer © (2006-11-24 14:29) [41]
> Real © (24.11.06 13:51) [40]
Готовую где ? :)
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.044 c