Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
PATIfon
0 / 0 / 0
Регистрация: 10.05.2010
Сообщений: 22
1

Графики неявно заданных функций

15.05.2010, 13:32. Просмотров 915. Ответов 6
Метки нет (Все метки)

Добрый вечер! Помогите пожалуйста..столкнулся с проблемой построения графиков двух функций, заданных неявно, на одном..выразить ни один из аргументов не удается. Подскажите пожалуйста как это можно реализовать в Pascal..скорее всего через замену..но не могу ничего придумать.. Какие есть еще возможности? Во второй функции можно выразить x, но это ничего не дает..в первой же вобще ничего не выражается.. Если есть идеи, отпишите пожалуйста
1.1-sin(y/3)+ln(1+(x+y)/5)-x=0;
0.5+cos(y*x/6)-y=0

Добавлено через 2 часа 8 минут
мне приходит в голову только через вайл пробежаться по всей области определения, и после каждого изменения х ставить условие: пробегаться по всем у и если функция обращается в 0, то закрашиваем этот пиксель..
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2010, 13:32
Ответы с готовыми решениями:

Графики функций
Доброго времени суток! Помогите пожалуйста с задачами: 1. Построить график функции...

Построить графики функций
Построить графики функций: y = - x2 + 4x – 5 на отрезке

Построить графики функций
Построить графики функций: y = - x2 + 4x – 5 на отрезке

построить ГРАФИКИ двух функций
Задание:

Построить графики указанных функций
построить графики указанных функций. при построении графика функции выбрать такой масштаб чтобы...

6
Puporev
Модератор
58101 / 44201 / 30534
Регистрация: 18.05.2008
Сообщений: 105,844
15.05.2010, 14:43 2
Цитата Сообщение от PATIfon Посмотреть сообщение
мне приходит в голову только через вайл пробежаться по всей области определения
В принципе верно, только наверное не по всей области, а некоторых интервалах по х и у.
Выбрать в массив все точки где значение функции F(x,y) равно нолю с заданной точностью.
По полученному массиву строить график.
1
PATIfon
0 / 0 / 0
Регистрация: 10.05.2010
Сообщений: 22
15.05.2010, 15:22  [ТС] 3
Вот примерный код..я давно не работал с графикой, наверняка напутал что-то с обозначениями или масштабом..поэтому не строит.. Взгляните пожалуйста если не составит труда правильно ли я реализовал алгоритм.. Спасибо!
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
program vyt;
uses crt,graph;
 const
  dx=40;
  dy=10;
  ex=20;
  m=9;
  n=10;
var
   x0,y0,gd,gm,a,b:integer;
   mx,my,x,y,c,d:real;
   st:string;
function F1(x,y:real):real;
begin
F1:=1.1-sin(y/3)+ln(1+(x+y)/5)-x;
end;
 function F2(x,y:real):real;
 begin{2}
 F2:=0.5+cos(y*x/6)-y;
 end{2};
   procedure Osi(var x0,y0:integer);
   var
      i,y:integer;
      x:real;
 begin{3}
    SetColor (white);
    x0:=getmaxX div 2;
    y0:=getmaxY div 2;
    Line (dx,y0,GetmaxX-dx,y0);
    Line (x0,dx,x0,GetmaxY-dx);
    OutTextXY(GetmaxX-dx-3,y0-3,'>');
    OutTextXY(x0-3,dx+2,'^');
    OutTextXY(x0-12,dx+2,'y');
    OutTextXY(GetmaxX-dx-8,y0+6,'x');
       for i:=n downto 1 do
        begin{*}
        line (x0-i*ex,y0-5,x0-i*ex,y0+5);
        str(-i,St);
        outtextxy(x0-(i*ex)-10,y0+8,St);
        end{*};
        for i:=1 to n do
        begin{**}
        line(x0+i*ex,y0-5,x0+i*ex,y0+5);
        Str(i,St);
        outtextxy(x0+i*ex,y0+8,St);
        end{**};
        for i:=m downto 1 do
        begin{)}
        line(x0-5,y0-i*ex,x0+5,y0-i*ex);
        Str(i,St);
        outtextxy(x0+8,y0-i*ex,St);
        end{)};
        for i:=1 to m do
         begin{+}
         line(x0-5,y0+i*ex,x0+5,y0+i*ex);
         Str(-i,St);
         outtextxy(x0+8,y0+i*ex,St);
         end{+};
         end{3};
 procedure Draw1(x0,y0:integer; ex:real; a,b:real);
   var
     h,l:real;k,xp,yp:integer; Yg:array[1..3] of real;
      begin{9}
          h:=(b-a)/200;
          SetColor(4);
                  y:=0;
                  k:=0;
 while (x<n) do
       begin{10}
        x:=x+h;
         while (y<m) do
                  begin
                  y:=y+h;
                  if F1(x,y)=0 then begin
                  k:=k+1;
                  Yg[k]:=y;
                  xp:=round(ex*x+x0);
                  yp:=round(ex*Yg[k]+y0);
                  putpixel(xp,yp,4);
                end; end;
       end{10};
      end{9};
begin{13}
      clrscr;
       gd:=Detect;
        Filemode:=0;
         Initgraph(gd,gm,'c:/langs/bp/bgi');
         writeln('vvedite a i b, a<b, a=')
         readln(a);
         writeln('b=');
         readln(b); 
         Osi(x0,y0);
          mx:=dx;
          my:=dy;
 Draw1(x0,y0,ex,a,b);
repeat until keyPressed;
            CloseGraph;
            end{13}.
0
Puporev
Модератор
58101 / 44201 / 30534
Регистрация: 18.05.2008
Сообщений: 105,844
15.05.2010, 15:29 4
Pascal
1
 if F1(x,y)=0 then begin
Это условие практически невыполнимо. Мы же имеем дело с вещественными числами и точки нужно находить с заданной точностью, типа
Pascal
1
 if abs(F1(x,y))<0.001 then begin
да и я бы сначала создал массив точек, а потом по массиву строил график, выводя по оси Х значения х, по У значения у.

Добавлено через 51 секунду
Вы массив после того как создадите выведите на экран и посмотрите, там вообще какие-то точки попали?
1
PATIfon
0 / 0 / 0
Регистрация: 10.05.2010
Сообщений: 22
15.05.2010, 15:53  [ТС] 5
Цитата Сообщение от Puporev Посмотреть сообщение
Pascal
1
 if F1(x,y)=0 then begin
Это условие практически невыполнимо. Мы же имеем дело с вещественными числами и точки нужно находить с заданной точностью, типа
Pascal
1
 if abs(F1(x,y))<0.001 then begin
да, точно..что это я..
Цитата Сообщение от Puporev Посмотреть сообщение
да и я бы сначала создал массив точек, а потом по массиву строил график, выводя по оси Х значения х, по У значения у.
М..здесь я вас не совсем понял..вы предлагаете мне построить два массива со значниями и строить как по х так, и по у? Здесь я в цикле беру значение х..ставлю условие..вычисляю и закрашиваю сразу же допустим 2 игрика..перехожу к следующему иксу и так до конца интервала..
Добавлено через 51 секунду
Вы массив после того как создадите выведите на экран и посмотрите, там вообще какие-то точки попали?[/QUOTE]
А после этих нехитрых преобразований дос бокс начал виснуть((( :
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
program vyt;
uses crt,graph;
 const
  dx=40;
  dy=10;
  ex=20;
  m=9;
  n=10;
var
   x0,y0,gd,gm,a,b:integer;
   mx,my,x,y,c,d:real;
   st:string;     f:text;
function F1(x,y:real):real;
begin
F1:=1.1-sin(y/3)+ln(1+(x+y)/5)-x;
end;
 function F2(x,y:real):real;
 begin{2}
 F2:=0.5+cos(y*x/6)-y;
 end{2};
   procedure Osi(var x0,y0:integer);
   var
      i,y:integer;
      x:real;
 begin{3}
    SetColor (white);
    x0:=getmaxX div 2;
    y0:=getmaxY div 2;
    Line (dx,y0,GetmaxX-dx,y0);
    Line (x0,dx,x0,GetmaxY-dx);
    OutTextXY(GetmaxX-dx-3,y0-3,'>');
    OutTextXY(x0-3,dx+2,'^');
    OutTextXY(x0-12,dx+2,'y');
    OutTextXY(GetmaxX-dx-8,y0+6,'x');
       for i:=n downto 1 do
        begin{*}
        line (x0-i*ex,y0-5,x0-i*ex,y0+5);
        str(-i,St);
        outtextxy(x0-(i*ex)-10,y0+8,St);
        end{*};
        for i:=1 to n do
        begin{**}
        line(x0+i*ex,y0-5,x0+i*ex,y0+5);
        Str(i,St);
        outtextxy(x0+i*ex,y0+8,St);
        end{**};
        for i:=m downto 1 do
        begin{)}
        line(x0-5,y0-i*ex,x0+5,y0-i*ex);
        Str(i,St);
        outtextxy(x0+8,y0-i*ex,St);
        end{)};
        for i:=1 to m do
         begin{+}
         line(x0-5,y0+i*ex,x0+5,y0+i*ex);
         Str(-i,St);
         outtextxy(x0+8,y0+i*ex,St);
         end{+};
         end{3};
 procedure Draw1(x0,y0:integer; ex:real; a,b:real);
   var
     h,l:real;k,xp,yp:integer; Yg:array[1..3] of real;
      begin{9}
          h:=(b-a)/200;
          SetColor(4);
                  y:=0;
                  k:=0;
 while (x<n) do
       begin{10}
        x:=x+h;
         while (y<m) do
                  begin
                  y:=y+h;
                  if abs(F1(x,y))<0.01 then begin
                  k:=k+1;
                  Yg[k]:=y;  write(f, Yg[k], ' '); append(f);
                  xp:=round(ex*x+x0);
                  yp:=round(ex*Yg[k]+y0);
 
                  putpixel(xp,yp,4);
                end; end;
       end{10};
      end{9};
begin{13}
      clrscr;
       gd:=Detect;
        Filemode:=0;
         Initgraph(gd,gm,'c:/langs/bp/bgi');
         assign(f,'xxx.txt');
         rewrite(f);
         writeln('vvedite a i b, a<b, a=');
         readln(a);
         writeln('b=');
         readln(b);
         Osi(x0,y0);
          mx:=dx;
          my:=dy;
 Draw1(x0,y0,ex,a,b);
repeat until keyPressed;
            CloseGraph;
            end{13}.
0
Puporev
Модератор
58101 / 44201 / 30534
Регистрация: 18.05.2008
Сообщений: 105,844
15.05.2010, 16:09 6
Вы все-то точки в массив не загоняйте. Массив можно 1 для каждой функции типа
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
type point=record
                x,y:real;
                end;
var m1,m2:array[1..500] 50 of point;
Затем при вычислениях
n:=0;
...........
if abs(F(x,y))<0.001 then
 begin
  n:=n+1;
  m1.x:=x;
  m1.y:=y;
 end;
также для другой функции.
Массивы думаю будут совсем небольшие.
1
PATIfon
0 / 0 / 0
Регистрация: 10.05.2010
Сообщений: 22
16.05.2010, 11:36  [ТС] 7
Pascal
1
2
3
type point=record
                x:real; y:array[1..3] of real;
                end;
точнее наверно вот так, ведь Y может принимать более одного значения, но не более 2х..хотя и врядли >1, но все же..
Спасибо за помощь..доразбираюсь сам и результаты выложу.

Добавлено через 17 секунд
Pascal
1
2
3
type point=record
                x:real; y:array[1..3] of real;
                end;
точнее наверно вот так, ведь Y может принимать более одного значения, но не более 2х..хотя и врядли >1, но все же..
Спасибо за помощь..доразбираюсь сам и результаты выложу.

Добавлено через 19 минут
Написал код программы..все значения считает верно, рисует график 2ой функции, но первой нет, дает ошибку в 80 строке кода.. За пределы разрешения экрана вроде не вылетают значения.. В чем может быть дело?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
program vyt;
uses crt,graph;
 const
  dx=40;
  dy=10;
  ex=20;
  m=9;
  n=10;
var
   x0,y0,gd,gm,a,b:integer;
   mx,my,x,y,c,d:real;
   st:string;     f:text;
function F1(x,y:real):real;
begin
F1:=1.1-sin(y/3)+ln(1+(x+y)/5)-x;
end;
 function F2(x,y:real):real;
 begin{2}
 F2:=0.5+cos(y*x/6)-y;
 end{2};
   procedure Osi(var x0,y0:integer);
   var
      i,y:integer;
      x:real;
 begin{3}
    SetColor (white);
    x0:=getmaxX div 2;
    y0:=getmaxY div 2;
    Line (dx,y0,GetmaxX-dx,y0);
    Line (x0,dx,x0,GetmaxY-dx);
    OutTextXY(GetmaxX-dx-3,y0-3,'>');
    OutTextXY(x0-3,dx+2,'^');
    OutTextXY(x0-12,dx+2,'y');
    OutTextXY(GetmaxX-dx-8,y0+6,'x');
       for i:=n downto 1 do
        begin{*}
        line (x0-i*ex,y0-5,x0-i*ex,y0+5);
        str(-i,St);
        outtextxy(x0-(i*ex)-10,y0+8,St);
        end{*};
        for i:=1 to n do
        begin{**}
        line(x0+i*ex,y0-5,x0+i*ex,y0+5);
        Str(i,St);
        outtextxy(x0+i*ex,y0+8,St);
        end{**};
        for i:=m downto 1 do
        begin{)}
        line(x0-5,y0-i*ex,x0+5,y0-i*ex);
        Str(i,St);
        outtextxy(x0+8,y0-i*ex,St);
        end{)};
        for i:=1 to m do
         begin{+}
         line(x0-5,y0+i*ex,x0+5,y0+i*ex);
         Str(-i,St);
         outtextxy(x0+8,y0+i*ex,St);
         end{+};
         end{3};
 procedure Draw1(x0,y0:integer; ex:real);
   var
     h,l:real;k,xp,yp:integer; Yg:array[1..100] of real;
      begin{9}
          h:=1/100;
          SetColor(8);
                  x:=0;
                  y:=-1;
                  k:=0;
 while (x<n) do
       begin{10}
        x:=x+h;
         while (y<m) do
                            begin
                  y:=y+h;
                  if abs(F1(x,y))<0.01 then begin
                  k:=k+1;
Yg[k]:=y;{ writeln(f, x:3:8,' ',Yg[k]:3:8, ' ', F1(x,y):3:8);writeln(f);}
                  xp:=round(ex*x+x0);
                  yp:=round(-ex*Yg[k]+y0);   {в этой строке}
                  putpixel(xp,yp,4);
                end; end;   y:=0;k:=0;
       end{10};
      end{9};
procedure Draw2(x0,y0:integer; ex:real);
   var
     h,l:real;k,xp,yp:integer; Yg:array[1..3] of real;
      begin{9}
          h:=1/100;
          SetColor(7);
                  x:=-10;
                  y:=0;
                  k:=0;
 while (x<n) do
       begin{10}
        x:=x+h;
         while (y<m) do
                            begin
                  y:=y+h;
                  if abs(F2(x,y))<0.01 then begin
                  k:=k+1;
Yg[k]:=y;{ writeln(f, x:3:8,' ',Yg[k]:3:8, ' ', F1(x,y):3:8);writeln(f);}
                  xp:=round(ex*x+x0);
                  yp:=round(-ex*Yg[k]+y0);
                  putpixel(xp,yp,7);
                end; end; y:=0;k:=0;
       end{10};
      end{9};
 
begin{13}
      clrscr;
       gd:=Detect;
        Filemode:=0;
         Initgraph(gd,gm,'c:/langs/bp/bgi');
         assign(f,'xxx.txt');
        { rewrite(f);}
         Osi(x0,y0);
          mx:=dx;
          my:=dy;
Draw1(x0,y0,ex); Draw2(x0,y0,ex);{close(f);}
repeat until keyPressed;
            CloseGraph;
            end{13}.
0
16.05.2010, 11:36
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2010, 11:36

Построить графики функций с обозначением
Последние 4 задачки, помогите решить плз: 1. Построить графики функций с обозначением осей...

Изобразить на экране дисплея графики следующих функций
Как построить график? Первое изображение И нарисовать паровозик ))

Вывести на экран в графическом режиме графики двух функций
Изображение должно занимать большую часть экрана, сопровождаться заголовком, содержать наименования...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.