Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2014, 15:20   #1
Olecinia
Пользователь
 
Регистрация: 19.11.2014
Сообщений: 13
Вопрос Написать программу, которая будет производить отделение корней графическим способом и уточнить решение итерационным алгоритмом

Здравствуйте, у меня такая проблемка...
Нужно написать программу на Паскаль или c++, которая будет производить отделение корней графическим способом и уточнять их методами решения систем нелинейных уравнений с точностью 0,001.
Помогите пожалуйста
Olecinia вне форума Ответить с цитированием
Старый 19.11.2014, 18:58   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Помогите пожалуйста
Чем и как помочь?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 19.11.2014, 21:01   #3
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Olecinia, графическим способом - это условность. Графически вы только сами можете решить, взяв в руки линейку, какрандаш. А у компьютера рук нет, поэтому решать все равно числовым методом ( приближение, итерация ), а уж потом построить график, если надо.
Так что пишите, какой конкретно метод и корень какого уравнения.
И можете еще поискать здесь - корни Паскаль или метод секущих, метод хорд , и т.д.
type_Oleg вне форума Ответить с цитированием
Старый 20.11.2014, 11:16   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Olecinia, графическим способом - это условность. Графически вы только сами можете решить, взяв в руки линейку, какрандаш.
Не соглашусь.
Зачем линейка и карандаш, если есть экран компьютера ?!
На нём вполне можно вывести график функции и, по сетке, ПРИМЕРНО определить корень (корни) уравнения. Это должен сделать ПОЛЬЗОВАТЕЛЬ программы. Именно - "на глазок"!
А потом уже полученное решение можно уточнять с помощью численных методов (итерационных, например).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.11.2014, 18:24   #5
Olecinia
Пользователь
 
Регистрация: 19.11.2014
Сообщений: 13
Печаль

Я написала программу на Паскале, по выводу графика, но у меня показывает неправильный интервал корней...
Код:
uses graph;
function F(x:real):real;
begin
F:=2*x*x-5-exp(ln(2)*x);
end;
var xn,xk,max,min,mx,my,dx:real;
    x:real;
    x0,y0,i,c,n:integer;
    s,s1:string;
    a:array[1..20,1..2] of integer;
begin
x0:=0;
initgraph(x0,y0,'');
xn:=-7;xk:=7;{интервал по Х}
x0:=getmaxX div 2;
mx:=(x0-30)/xk;{масштаб по Х}
y0:=getmaxY div 2;
max:=F(xn);
min:=F(xn);
x:=xn;
while x<=xk do
 begin
  if F(x)>max then max:=F(x);
  if F(x)<min then min:=F(x);
  x:=x+0.05;
 end;
if max>abs(min) then my:=(y0-30)/max
else my:=(y0-30)/abs(min);
setbkcolor(15);{цвет фона}
setcolor(8);{цвет линий}
line(0,y0,getmaxX,y0);{оси}
line(x0,0,X0,getmaxY);
for i:=1 to 10 do{максимальное количество засечек в одну сторону}
  begin
    line(x0-3,y0-round(i*my*10),x0+3,y0-round(i*my*10));{засечки на оси У}
    line(x0-3,y0+round(i*my*10),x0+3,y0+round(i*my*10));
    {подпись оси У}
    str(i*10,s);
    outtextXY(x0-25,y0-round(i*my*10),s);{соответственно засечкам}
    outtextXY(x0-30,y0+round(i*my*10),'-'+s);
    line(x0+round(i*mx),y0-3,x0+round(i*mx),Y0+3); {засечки на оси Х}
    line(x0-round(i*mx),y0-3,x0-round(i*mx),Y0+3);
    {подпись оси Х}
    str(i,s);
    outtextXY(x0+round(i*mx),y0+10,s);
    outtextXY(x0-round(i*mx),y0+10,'-'+s);
  end;
{центр}
outtextXY(x0+5,y0+10,'0');
{подписи концов осей}
outtextXY(getmaxX-10,y0-10,'X');
outtextXY(x0+5,10, 'Y');
{график}
x:=xn;
dx:=0.01;
n:=0;
moveto(x0+round(x*mx),y0-round(F(x)*my));
while x<=xk do
 begin
  setcolor(12);
  setlinestyle(0,0,1);
  lineto(x0+round(x*mx),y0-round(F(x)*my));
  if F(x)*F(x+dx)<0 then
   begin
    setcolor(9);
    setlinestyle(0,0,3);
    circle(x0+round(x*mx),y0-round(F(x)*my),2);
    n:=n+1;
    if x<0 then
     begin
      a[n,2]:=trunc(x);
      a[n,1]:=a[n,2]-1;
     end
    else
     begin
      a[n,1]:=trunc(x);
      a[n,2]:=a[n,1]+1;
     end;
   end;
  x:=x+dx;
 end;
{название}
setcolor(12);
outtextXY(x0+30,20,'Grafik functii y=2x^2-5-2^x');
outtextXY(x0+50,40,'na intervale [-7;7]');
y0:=getmaxY-200;
outtextXY(50,y0,'intervaly kornej');  {Здесь показывает неправильный ответ}
for i:=1 to n do
 begin
  str(a[i,1],s);
  str(a[i,2],s1);
  outtextXY(50,y0+20*i,'['+s+';'+s1+']');
 end;
readln
end.

Последний раз редактировалось Stilet; 23.11.2014 в 19:36.
Olecinia вне форума Ответить с цитированием
Старый 23.11.2014, 19:38   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
outtextXY(50,y0,'intervaly kornej'); {Здесь показывает неправильный ответ}
Это шутка? О_о
Ты имела ввиду что ответ неверный показывается в цикле ниже этой строки?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.11.2014, 21:05   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Olecinia, ну, судя по тому, что код навороченный и работает,
писали его не вы...

А в чём, собственно претензии к результату?!!!
интервалы с корнями, на мой взгляд, найдены верно!
я добавил в конце пару циклов и нашёл корни:
Код:
 for i:=1 to n do begin
   x:=a[i,1];
   while (abs(F(x))>0.0001) and (x<a[i,2]) do x:=x+0.00001;
   str(x:2:6,s);
   outtextXY(150,y0+20*i,'x = '+s);
 end;
graphic01.jpg
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.11.2014, 19:21   #8
Вадим Вергун
Пользователь
 
Регистрация: 01.11.2014
Сообщений: 52
Смущение

По моему под графическим способом имеется ввиду рисование прямоугольного треугольника с гипотенузой числом корень которого нужно извлеки. А после просто запрашивая цвет пикселов найти катеры График функции это приземлённо... не оригинально.
Вадим Вергун вне форума Ответить с цитированием
Старый 02.12.2014, 17:17   #9
Olecinia
Пользователь
 
Регистрация: 19.11.2014
Сообщений: 13
Восклицание

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Olecinia, ну, судя по тому, что код навороченный и работает,
писали его не вы...

А в чём, собственно претензии к результату?!!!
интервалы с корнями, на мой взгляд, найдены верно!
я добавил в конце пару циклов и нашёл корни:
Код:
 for i:=1 to n do begin
   x:=a[i,1];
   while (abs(F(x))>0.0001) and (x<a[i,2]) do x:=x+0.00001;
   str(x:2:6,s);
   outtextXY(150,y0+20*i,'x = '+s);
 end;

Вложение 71385
Подскажите пожалуйста а в какую именно часть программы вы это добавили?
Olecinia вне форума Ответить с цитированием
Старый 02.12.2014, 20:21   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот целиком ваш код программы с добавленным мною кодом:

Код:
uses graph;
function F(x:real):real;
begin
F:=2*x*x-5-exp(ln(2)*x);
end;
var xn,xk,max,min,mx,my,dx:real;
    x:real;
    x0,y0,i,c,n:integer;
    s,s1:string;
    a:array[1..20,1..2] of integer;
begin
x0:=0;
initgraph(x0,y0,'');
xn:=-7;xk:=7;{интервал по Х}
x0:=getmaxX div 2;
mx:=(x0-30)/xk;{масштаб по Х}
y0:=getmaxY div 2;
max:=F(xn);
min:=F(xn);
x:=xn;
while x<=xk do
 begin
  if F(x)>max then max:=F(x);
  if F(x)<min then min:=F(x);
  x:=x+0.05;
 end;
if max>abs(min) then my:=(y0-30)/max
else my:=(y0-30)/abs(min);
setbkcolor(15);{цвет фона}
setcolor(8);{цвет линий}
line(0,y0,getmaxX,y0);{оси}
line(x0,0,X0,getmaxY);
for i:=1 to 10 do{максимальное количество засечек в одну сторону}
  begin
    line(x0-3,y0-round(i*my*10),x0+3,y0-round(i*my*10));{засечки на оси У}
    line(x0-3,y0+round(i*my*10),x0+3,y0+round(i*my*10));
    {подпись оси У}
    str(i*10,s);
    outtextXY(x0-25,y0-round(i*my*10),s);{соответственно засечкам}
    outtextXY(x0-30,y0+round(i*my*10),'-'+s);
    line(x0+round(i*mx),y0-3,x0+round(i*mx),Y0+3); {засечки на оси Х}
    line(x0-round(i*mx),y0-3,x0-round(i*mx),Y0+3);
    {подпись оси Х}
    str(i,s);
    outtextXY(x0+round(i*mx),y0+10,s);
    outtextXY(x0-round(i*mx),y0+10,'-'+s);
  end;
{центр}
outtextXY(x0+5,y0+10,'0');
{подписи концов осей}
outtextXY(getmaxX-10,y0-10,'X');
outtextXY(x0+5,10, 'Y');
{график}
x:=xn;
dx:=0.01;
n:=0;
moveto(x0+round(x*mx),y0-round(F(x)*my));
while x<=xk do
 begin
  setcolor(12);
  setlinestyle(0,0,1);
  lineto(x0+round(x*mx),y0-round(F(x)*my));
  if F(x)*F(x+dx)<0 then
   begin
    setcolor(9);
    setlinestyle(0,0,3);
    circle(x0+round(x*mx),y0-round(F(x)*my),2);
    n:=n+1;
    if x<0 then
     begin
      a[n,2]:=trunc(x);
      a[n,1]:=a[n,2]-1;
     end
    else
     begin
      a[n,1]:=trunc(x);
      a[n,2]:=a[n,1]+1;
     end;
   end;
  x:=x+dx;
 end;
{название}
setcolor(12);
outtextXY(x0+30,20,'Grafik functii y=2x^2-5-2^x');
outtextXY(x0+50,40,'na intervale [-7;7]');
y0:=getmaxY-200;
outtextXY(50,y0,'intervaly kornej');  {Здесь показывает неправильный ответ}
for i:=1 to n do
 begin
  str(a[i,1],s);
  str(a[i,2],s1);
  outtextXY(50,y0+20*i,'['+s+';'+s1+']');
 end;

 for i:=1 to n do begin
   x:=a[i,1];
   while (abs(F(x))>0.0001) and (x<a[i,2]) do x:=x+0.00001;
   str(x:2:6,s);
   outtextXY(150,y0+20*i,'x = '+s);
 end;

readln

end.
Вы не ответили на мой вопрос, что Вас в этом коде не устроило?!
Почему Вы решили, что
Цитата:
Код:
uttextXY(50,y0,'intervaly kornej');  {Здесь показывает неправильный ответ}
?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать программму, которая будет решать систему уравнений матричным способом Наталья1991 Паскаль, Turbo Pascal, PascalABC.NET 1 15.05.2012 01:10
Можно ли написать программу которая будет работать в Windows и Linux Arassir Qt и кроссплатформенное программирование С/С++ 2 27.10.2011 23:35
Возможно ли написать такую программу которая будет решать уравнение ? Anizotrop Помощь студентам 3 28.09.2011 13:49
Написать программу, которая будет использовать ранее созданную библиотеку. sanya94 Общие вопросы C/C++ 3 19.02.2011 00:58
Delphi: Отделение корней уравнения графическим способом JustSmile Помощь студентам 1 29.11.2009 10:33