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

По полученным точкам графика перегиба при разных t построить огибающую линию

08.10.2014, 14:04. Просмотров 981. Ответов 5

Программа для графика уже есть, требуется ее доделать(доработать).
Собственно задание:
1. погонять кривую при разных t
2. найти на ней при разных t максимумы и минимумы, точки перегиба.
3. По полученным точкам перегиба при разных t построить огибающую линию.
4 По общим точкам минимума (по точкам касания к ней общей касательной) построить
огибающую.


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
uses graphABC;
var
  A, B: real;
function F(x,t:real):real;
begin
f := A * x + t * (x * ln(x) + (1 - x) * ln(1-x)) + B * t * (1-x)
end;
var t,xn,xk,x,mx,my,dx:real;
    x0,y0,i:integer;
    s:string;
begin
x0:=50;
y0:=windowheight-50;
t:=1;
xn:=0;
A:=1*t;
B:=1*t;
xk:=1;
mx:=(windowwidth-x0-30)/xk;
my:=(y0-40)/F(0.001,t);
line(0,y0,windowwidth,y0);
line(x0,0,x0,windowheight);
for i:=1 to 10 do
 begin
  line(x0+round(i*mx/10),y0-3,x0+round(i*mx/10),y0+3);
  str(i/10:0:1,s);
  textout(x0+round(i*mx/10),y0+10,s);
  line(x0-3,y0-round(i*my),x0+3,y0-round(i*my));
  str(i/10,s);
  textout(x0-20,y0-round(i*my/10),s);
 end;
 
textout(x0+5,y0+10,'0');
 
textout(windowwidth-20,y0-20,'X');
textout(x0+10,10, 'Y');
 
x:=xn;
dx:=0.001;
while x<=xk do
 begin
  if x>0 then setpixel(x0+round(x*mx),y0-round(F(x,t)*my),clRed);
  x:=x+dx;
 end;
end.
Добавлено через 29 минут
1) Нужно сделать так, чтобы при построении графика t не была постоянной величиной, а менялась в каком-то пределе, например от -1 до 1.


по точкам максимума, минимума, перегиба:
2) построить касательную
3) построить огибающую
Цитата Сообщение от Quarris Посмотреть сообщение
3. По полученным точкам перегиба при разных t построить огибающую линию.
4 По общим точкам минимума (по точкам касания к ней общей касательной) построить
огибающую.
Добавлено через 19 часов 1 минуту
Просто как сделать так, чтобы программа сама проводила линию по точкам я вообще не понимаю. Ну, для начала она должна их находить по какому-то принципу по идее. В общем, я запутался совсем. Помогите, если кто знает что делать с этим.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2014, 14:04
Ответы с готовыми решениями:

Построить огибающую для двух графиков по общим точкам касания
Здравствуйте! Нужна помощь с программой. Имеется два графика, требуется провести касательную к...

Имеется график, нужно построить его огибающую по точкам, которые ставит сам пользователь
Добрый день! Нужна помощь с программой MathCad Имеется график, нужно построить его огибающую по...

Построить замкнутую линию по заранее указанным точкам
Дано n точек на плоскости. Указать (n-1)-звенную не самопересекающуюся замкнутую ломаную,...

Составить график функции. Дана функция нужно построить график по полученным точкам
Помогите составить график функции. Дана функция нужно построить график по полученным точкам...

5
901 / 749 / 832
Регистрация: 06.09.2013
Сообщений: 1,561
08.10.2014, 14:21 2
Чобы найти точки перегиба, надо найти вторую производную и приравнять её к 0. Если я правильно посчитал, то
https://www.cyberforum.ru/cgi-bin/latex.cgi?{f}^{''}(t,x)=A+\frac{t}{x}+\frac{1}{1-x}
1
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 22
08.10.2014, 21:46  [ТС] 3
спасибо, попробую применить это в программе
0
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 22
20.10.2014, 15:44  [ТС] 4
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
uses
  graphABC;
 
var
  A, B: real;
  c: integer;
 
function F(x, t: real; k: byte): real;
begin
  case k of
    3: F := A * x + t * (x * ln(x) + (1 - x) * ln(1 - x)) + B * t * (1 - x); //ãðàôèê
    1: F := t*(1/(1-x)+1/x); //îãèáàþùàÿ
    2: F := (A-B*t+t*(-ln(1-0.77)+ln(0.77)))*(x-0.77)  //êàñàòåëüíàÿ
  end
end;
 
var
  t, xn, xk, x, mx, my, dx: real;
  x0, y0, i, k, i1: integer;
  s: string;
 
begin
  x0 := 50;//íà÷àëî êîîðäèíàò íà ýêðàíå
  y0 := windowheight - 50;
  t:=-1;
  xn := 0;
  xk := 1;//èíòåðâàë ïî Õ
  mx := (windowwidth - x0 - 30) / xk;//ìàñøòàá ïî Õ
  my := (y0 - 40) / 7{F(0.001,t, 3)};//ïî Ó
  line(0, y0, windowwidth, y0);//îñè
  line(x0, 0, x0, windowheight);
  for i := 1 to 10 do//ìàêñèìàëüíîå êîëè÷åñòâî çàñå÷åê â îäíó ñòîðîíó
  begin
    line(x0 + round(i * mx / 10), y0 - 3, x0 + round(i * mx / 10), y0 + 3); //çàñå÷êè íà îñè Õ
    str(i / 10:0:1, s); //ïîäïèñü îñè Õ
    textout(x0 + round(i * mx / 10), y0 + 10, s);
    line(x0 - 3, y0 - round(i * my), x0 + 3, y0 - round(i * my)); //çàñå÷êè íà îñè Y
    str(i, s);//ïîäïèñü îñè Y
    textout(x0 - 20, y0 - round(i * my), s);
  end;
  //öåíòð
  textout(x0 + 5, y0 + 10, '0');
  //ïîäïèñè êîíöîâ îñåé
  textout(windowwidth - 20, y0 - 20, 'X');
  textout(x0 + 10, 10, 'Y');
  //ãðàôèê
  c:=clBlue;
  dx := 0.001;
  for k := 1 to 3 do
  begin
    x := xn;
    if k = 2 then begin
      c:=clGreen
      end
       else
    if k = 3 then begin
      A := 1 * t;
      B := 1 * t;
      c:=clRed
    end;
    while x <= xk do
    begin
      if x > 0 then setpixel(x0 + round(x * mx), y0 - round(F(x, t, k) * my), c);
      x := x + dx; //íàðàùèâàåì õ
    end;
  end
end.
собственно вот, вышло сделать касательную с огибающей, но, я кое-чего так и не понял:

1)мне надо чтобы "t" была промежутком(вроде, возможно периодом) от -1 до 1 например, но когда я пробовал делать так, ничего не менялось. Если бы все было правильно график должен был бы напоминать синусоиду, но ничего подобного не выходит. Что с этим можно сделать?
2) огибающая получилась снизу, но я не понял как подвинуть график выше, чтобы на экране отображалась нижняя часть (где отрицательные "y").

Помогите пожалуйста, вроде сильно менять ничего не нужно, небольшие правки только, хотя на счет "t" и как сделать из графика синусоиду, за счет "t" (или еще как-то), я не уверен.
0
138 / 101 / 102
Регистрация: 03.02.2014
Сообщений: 422
21.10.2014, 01:26 5
Для примера выложил. По графику видно, что функция, данная автором темы, и функция описанная в посте По полученным точкам графика перегиба при разных t построить огибающую линию у них нету общих точек.
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
uses graphABC;
type
  fn=function(x,t:real):real;
const
  xl=45; xp=25; yv=5; yn=25;   { поля }
var
  t,xn,xk,ymin,ymax,ymin_,ymax_,x,y,mx,my,dx:real;
  z:real;
  n:integer;
  x0,y0,i:integer;
  s:string;
  A, B: real;
 
function F(const x,t:real):real;
begin
  f := A * x + t * (x * ln(x) + (1 - x) * ln(1-x)) + B * t * (1-x);
end;
 
function Fpp(const x,t:real):real;
begin
  Fpp:=A+t/x+1/(1-x);
end;
 
procedure F_min_max(var min,max:real; f:fn);
begin
  x:=xn; min:=0; max:=0;
  while x<=xk do begin
    y:=f(x,t); x:=x+dx;
    if y<min then min:=y
    else
    if y>max then max:=y;
  end;
end;
 
procedure F_draw(f:fn);
begin
  x:=xn;
  MoveTo(x0+round(x*mx),y0-round(f(x,t)*my));
  while x<=xk do
  begin
    if x>0 then LineTo(x0+round(x*mx),y0-round(f(x,t)*my));  //setpixel(x0+round(x*mx),y0-round(f(x,t)*my),clRed);
    x:=x+dx;
  end;
end;
 
begin
  MaximizeWindow;
  xn:=0.001;
  xk:=0.999;
  dx:=0.01;
  t:=1;
  A:=1*t;
  B:=1*t;
  { анализ функции }
  F_min_max(ymin,ymax,F);
  F_min_max(ymin_,ymax_,Fpp);
  if ymin>ymin_ then ymin:=ymin_;
  if ymax<ymax_ then ymax:=ymax_;
  { вычисление масштаба }
  mx:=(WindowWidth-xl-xp)/abs(xk-xn);
  my:=(WindowHeight-yv-yn)/abs(ymax-ymin);
  { начало координат }
  x0:=xl;
  y0:=yv+round(my*ymax);
  { оси координат }
  line(x0,y0,windowwidth-xp,y0);   {OX}
  line(x0,yv,x0,windowheight-yn);  {OY}
  n:=10;
  for i:=1 to n do
  begin
    z:=abs(xk-xn)/n*i;
     line(x0+round(z*mx),y0-3,x0+round(z*mx),y0+3);
      str(z:0:2,s);
       textout(x0+round(z*mx),y0+10,s);
    z:=abs(ymax-ymin)/n*i;
     line(x0-3,y0-round(z*my),x0+3,y0-round(z*my));
      str(z:0:2,s);
       textout(0,y0-round(z*my),s);
  end;
  textout(x0,y0+10,'0');
  textout(windowwidth-xp,y0-20,'X');
  textout(x0+10,yv, 'Y');
  { вывод функции }
  SetPenColor(clRed);
  F_draw(f);
  SetPenColor(clGreen);
  F_draw(Fpp);
end.
0
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 22
21.10.2014, 22:01  [ТС] 6
я просто немного поменял условие, вместо t=1 поставил t=-1, так лучше выглядит. Но суть в том, что по идее график должен прогоняться через разные точки (не знаю как точно сказать, t не должно быть постоянной величиной), например от -2 до 2 - t=[-2;2]. Но так выходит не совсем то, график совсем не пересекает ось X.

Добавлено через 6 минут
Можно ли как то за счет манипуляций с t сделать его более похожим на синусоиду? Что-бы было побольше точек перегиба что ли.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2014, 22:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как нарисовать линию огибающую другие области?
Например как здесь: тут или тут То есть указать точку из которой идёт линия и конечную. А...

Сколько разных замкнутых контуров можно построить по n точкам?
Линии контуров могут пересекаться. Если имеются 3 точки, можно построить 1 замкнутый контур -...

Графика. Построить ломаную линию по координатам из файла
Помогите пожалуйста сделать вот такую задачку:Координаты ломаной линии, заданные целыми числами (в...

3D график по полученным точкам
привет всем, возникла вроде бы довольно легкая проблема, но бьюсь над ней уже несколько дней и весь...


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

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

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