Консультация № 181318
13.12.2010, 18:43
55.50 руб.
0 24 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Построить фигуру Лиссажу путем генерации сигналов y=sinx и y=cosx по ортогональным осям. Вычисления производить путем поперменной генерации сигналов конечно-разностным методом в интервале изменения аргумента 0...2pi. Обеспечить ошибку относительно системных функций e=10^(-5).Вывод информации графический с текстовым контролем ошибок.
Программу выполнить на turbo pascal.

Заранее спасибо!

Обсуждение

Неизвестный
13.12.2010, 22:00
общий
А конечно-разностные, да еще сигналы зачем? Уточните... Не понятно! Или sin/cos рассчитывать не по формулам?
Неизвестный
13.12.2010, 22:29
общий
сигналы все по формулам задаются sin/cos,а построение производить с помощью конечно-разностного метода.вот как то так
давно
Профессионал
304622
583
14.12.2010, 13:59
общий
[forid=351641]
Может быть с помощью конечно-разностной интерполяции?
Неизвестный
14.12.2010, 14:37
общий
Адресаты:
как мне подсказали:
конечно разностный метод используется для решения дифуров,в данном случае чтобы рисовать все точки (это невозможно на компе), рисуются только точки, соответствующие
t0 = 0
t1 = h
t2 = 2*h
....
tN = N*h
(N и h выбирается так, чтобы картинка была красивой, например, h = 0.001, H = trunc(2*Pi/h))
И для каждого такого момента t рисуется своя точка (с координатами sin(t*2), cos(t*3), например).
То есть вывод делается таким циклом:

for i := 0 to N do begin
t := i*h;

ToScreen(sin(t*2), cos(t*3));
end;

В полной правильности данной подсказке,я правда не уверен
Неизвестный
14.12.2010, 14:50
общий
И каких таких "дифуров" решать надо?
Неизвестный
14.12.2010, 17:48
общий
ну их же тут нету,значит никаких.что то я с этим заданием совсем зауптался а вроде ж метод интерполяции называется не конечно-разностная интерполяция,а метод конечных разностей?или это одно и тоже?
давно
Профессионал
304622
583
14.12.2010, 19:26
общий
Конечные разности применяются и для численного решения решнеий дифф. уравнений -- тогда это обычно называется методом конечных разностей --, и для построения некоторых интерполяционных формул. Ещё на отношении конечных разностей можно приближённо вычислять производные.
давно
Профессионал
304622
583
14.12.2010, 19:45
общий
Давайте для начала так. Вот программа:

Код:

uses graph,crt;

var i,j:integer;
x0,y0,kx,ky:double;
h,w1,w2:double;
n:integer;

function XX(x:double):integer;
begin
XX:=round((x-x0)*kx);
end;

function YY(y:double):integer;
begin
YY:=getmaxy-round((y-y0)*ky);
end;

begin

i:=0; j:=0;
initgraph(i,j,'');

x0:=-1.2;
y0:=-1.2;
kx:=getmaxx/2.4;
ky:=getmaxy/2.4;

n:=100;
h:=2*pi/n;
w1:=2*pi/2;
w2:=2*pi/6;
moveto(XX(0),YY(1));
for i:=1 to n do
lineto(XX(sin(w1*i*h)),YY(cos(w2*i*h)));

readkey;
closegraph;
end.


Требуемую фигуру она рисует, хотя конечных разностей не использует и "ошибку относительно системных функций" не контролирует. Выясните, пожалуйста, что тут не то? sin и cos не должны использоваться?
давно
Профессионал
304622
583
14.12.2010, 19:49
общий
Или нельзя пользоваться линиями, а выводить поточечно?

Код:
uses graph,crt;

var i,j:integer;
x0,y0,kx,ky:double;
h,w1,w2:double;
n:integer;

function XX(x:double):integer;
begin
XX:=round((x-x0)*kx);
end;

function YY(y:double):integer;
begin
YY:=getmaxy-round((y-y0)*ky);
end;

begin

i:=0; j:=0;
initgraph(i,j,'');

x0:=-1.2;
y0:=-1.2;
kx:=getmaxx/2.4;
ky:=getmaxy/2.4;

n:=100;
h:=2*pi/n;
w1:=2*pi/2;
w2:=2*pi/6;
putpixel(XX(0),YY(1),15);
for i:=1 to n do
putpixel(XX(sin(w1*i*h)),YY(cos(w2*i*h)),15);

readkey;
closegraph;
end.
Неизвестный
14.12.2010, 19:50
общий
вот что я нашел про конечно-разностные методы
Прикрепленные файлы:
4c68b91f6148c7942e879ada40eb45f6.rar
Неизвестный
14.12.2010, 19:54
общий
Адресаты:
завтра у меня будет возможность проконсультироваться с преподавателм по этому вопросу,какие мне задать ему вопросы?что значит в тексте программы double и getmax?
Неизвестный
14.12.2010, 19:57
общий
линиями пользоваться можно,мы так на лабораторных делали,вот одно из заданий
Прикрепленные файлы:
ec509623eead44272c5a332f8fb8ca8a.txt
давно
Профессионал
304622
583
14.12.2010, 20:20
общий
вот что я нашел про конечно-разностные методы


Об этом можете не беспокоиться. Что такое конечно-разностные методы, я знаю.

проконсультироваться с преподавателм по этому вопросу,какие мне задать ему вопросы?


Каким образом и для чего здесь применяется метод конечных разностей?

И вообще, Вы, возможно, не очень понимаете суть и смысл задачи. Наверно, это стоило бы прояснить.

что значит в тексте программы double


Один из вещественных типов данных. Можно заменить на real.

и getmax?


Размер экрана графическом режиме. Можно заменить на 640 и 480.
давно
Профессионал
304622
583
14.12.2010, 20:47
общий
линиями пользоваться можно,мы так на лабораторных делали,вот одно из заданий


Посмотрел. Это решение ДУ 2-го порядка методом Рунге-Кутты IV. С фигурами Лиссажу, наверно, что-то другое.
Неизвестный
15.12.2010, 19:32
общий
Адресаты:
проконсультировался с преподавателем.Этот метод описывается в его книге
прикрепил главу про эти методы. Там в конце то,что надо.В этом методе sin и cos не считаются.
ошибка относительно системных функций берется из разницы конечно-разностного метода и метода когда фигура строится при помощи системы

Прикрепленные файлы:
47065670bd1b0fa009263a497b01bb45.docx
давно
Профессионал
304622
583
15.12.2010, 22:48
общий
Сохраните, пожалуйста, его в старом формате word. У меня c Word 2007 некоторые трудности.
Неизвестный
16.12.2010, 09:12
общий
Адресаты:
сохранил
Прикрепленные файлы:
95887621febc89f7f1f1f218d639c0eb.doc
давно
Профессионал
304622
583
16.12.2010, 10:59
общий
Итак. Получается вот что:

1) В тексте даны формулы для "S1=sin(at); S2 = cos(at)". Т.е. с одинаковыми частотами. Это значит, что они рисуют только круг. Чтобы рисовать другие фигуры -- т.е. на разных частотах -- надо построить другие формулы. Это от вас требует преподаватель или ограничиться рисованием круга?

2) Не дано никаких формул для оценки погрешности (в численных методах их обычно стараются сформулировать). По тексту получается, что надо сравнивать с точными значениями sin(at) и cos(at). С математической точки зрения нелогично. Но если так надо, пожалуйста, сделаем так.
Неизвестный
16.12.2010, 21:27
общий
Адресаты:
1) В тексте даны формулы для "S1=sin(at); S2 = cos(at)". Т.е. с одинаковыми частотами. Это значит, что они рисуют только круг. Чтобы рисовать другие фигуры -- т.е. на разных частотах -- надо построить другие формулы. Это от вас требует преподаватель или ограничиться рисованием круга?

преподаватель хочет чтоб было сделано как написано в его книге,если строит круг, то пусть


2) Не дано никаких формул для оценки погрешности (в численных методах их обычно стараются сформулировать). По тексту получается, что надо сравнивать с точными значениями sin(at) и cos(at). С математической точки зрения нелогично. Но если так надо, пожалуйста, сделаем так.

необходимо взять какое то одно значение аргумента для двух методов и сравнить результаты и вот чтоб погрешность эта не превышла заданную
давно
Профессионал
304622
583
16.12.2010, 23:07
общий
Написал по тому, что нам удалось сформулировать. Чепуха какая-то, поэтому пока кладу сюда в минифорум. Если устраивает перенесу в ответы, добавлю комментарии.

Что мне не нравится. Контроль погрешности я сделал по тексту книги. Написано:
Ошибка увеличивается к последующим шагам. Когда она превышает допустимые значения

Я это понял так, что надо на каждом шагу вычислять расхождение между (S1,S2) И (sin(at), cos(at)). Соответственно под условием "if dS>e" я присваиваю в S1 и S2 тчоные значения.

Проблема вот в чём. Я задал разбиение n=1000 (т.е. шаг h=2pi/1000). При предложенном e=10-5 условие коррекции срабатывает на каждом шаге. Получается, что требуемая точность слишком высока. Взял n=10000 -- условие срабатывает через 3 шага. Вот так.

Код:

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;
y0:=-1.2;
kx:=640/2.4;
ky:=480/2.4;

n:=1000;
dt:=2*pi/n;
alfa:=2*pi/2;


setcolor(15);
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.
Неизвестный
16.12.2010, 23:40
общий
Адресаты:
завтра тогда у преподавателя еще раз проконсультируюсь
Неизвестный
17.12.2010, 18:12
общий
Адресаты:
сдал эту работу Большое спасибо!
давно
Профессионал
304622
583
18.12.2010, 11:09
общий
это ответ
Здравствуйте, Посетитель - 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.

5
давно
Профессионал
304622
583
18.12.2010, 11:11
общий
Большое спасибо!


Там есть кнопочка "Оценить ответ"
Форма ответа