Вопрос № 181318: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Построить фигуру Лиссажу путем генерации сигналов y=sinx и y=cosx по ортогональным осям. Вычисления производить путем поперменной генерации сигналов конечно-разностным методом ...
Вопрос № 181318:
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Построить фигуру Лиссажу путем генерации сигналов y=sinx и y=cosx по ортогональным осям. Вычисления производить путем поперменной генерации сигналов конечно-разностным методом в интервале изменения аргумента 0...2pi. Обеспечить ошибку относительно системных функций e=10^(-5).Вывод информации графический с текстовым контролем ошибок. Программу выполнить на turbo pascal.
Отвечает Сергей Бендер (Практикант) :
Здравствуйте, Посетитель - 351641!
Ну что ж! Раз в таком виде устраивает, то вот программа с пояснениями. Отмечу лишь, что: а) это называется конечно-разностной экстраполяцией; б) вполне можно было построить конечно-разностные формулы и для различных частот по синусу и косинусу; несложно.
Код:
uses graph,crt;
const e=1e-5; {Погрешность}
var i,j:integer; x0,y0,kx,ky:real; {Парамметры преобразования в экранные координаты} dt,alfa,S1,S2,h1,h2:real; {Параметры фигуры и разностной схемы} n:integer; {Разбиение временного интервала} dS:double; {Отклонение конечно=разностного решения от точного}
begin
i:=0; j:=0;
initgraph(i,j,' ');
x0:=-1.2; {Размер выводимой координатной плоскости } kx:=640/2.4; {по X: от -1,2 до 1,2}
y0:=-1.2; {Размер выводимой координатной плоскости } ky:=480/2.4; {по X: от -1,2 до 1,2}
n:=1000; dt:=2*pi/n; alfa:=2*pi/2;
{Белым цветом выводится фигура по точным значениями} setcolor(15); {Начальная позиция (0;1)} moveto(round(-x0*kx),480-round((1-y0)*ky)); for i:=1 to
n do lineto(round((sin(alfa*i*dt)-x0)*kx),480-round((cos(alfa*i*dt)-y0)*ky));
h1:=cos(alfa*dt); h2:=sin(alfa*dt); S1:=0; S2:=1; {Жёлтым цветом выводятся конечно-разностные значения} setcolor(14); moveto(round(-x0*kx),480-round((1-y0)*ky)); dS:=0; for i:=1 to n do begin S1:=S1*h1 + S2*h2; S2:=S2*h1 - S1*h2; lineto(round((S1-x0)*kx),480-round((S2-y0)*ky
)); {Расхождение между конечно-разностным и точным значением } dS:=sqrt(sqr(S1-sin(alfa*i*dt)) + sqr(S2-cos(alfa*i*dt))); if dS>e then begin {Присваиваются точные значения} S1:=sin(alfa*i*dt); S2:=cos(alfa*i*dt); {Начинается рисование с нвой позиции} moveto(round((S1-x0)*kx),480-round((S2-y0)*ky)); end; end;
readkey; closegraph; end.
Ответ отправил: Сергей Бендер (Практикант)
Ответ отправлен: 18.12.2010, 11:09
Номер ответа: 264873
Оценка ответа: 5
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 264873
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.