Показать сообщение отдельно
Старый 25.05.2010, 23:17   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от anonimka Посмотреть сообщение
Вообще желательно в одну,где график будет занимать большую часть экрана.
Задать параметры функции InitGraph я смогу.
Тогда, например, как-то так:
Код:
USES Graph,CRT;

VAR
 Xmin,Xmax,X,dX,Epsilon1,Epsilon2,b,Xbef,Xaft,AV:REAL;
 XgrMin,XgrMax,YgrMin,YgrMax,StepGridX,StepGridY:WORD;
 ScaleX,ScaleY:REAL;

Function f1(xf:Real):Real;
 VAR S,a:Real;
     k:Word;
 begin
  S:=0;
  a:=1;
  k:=1;
  Repeat
   S:=S+a;
   a:=a*xf/k;
   Inc(k);
  Until Abs(a)<Epsilon1;
  f1:=S;
 end;

Function f2(xf:Real):Real;
 begin
  f2:=Exp(xf)+b;
 end;

BEGIN
 Write('Xmin= ');
 ReadLn(Xmin);
 Write('Xmax= ');
 ReadLn(Xmax);
 Write('dX= ');
 ReadLn(dX);
 Write('Epsilon1= ');
 ReadLn(Epsilon1);
 Write('Epsilon2= ');
 ReadLn(Epsilon2);
 Repeat
  Write('b= ');
  ReadLn(b);
  If b>=0 then WriteLn('Incorrect value of b!!! It must be <0');
 Until b<0;

 { Newton calculation }
 Xaft:=0;
 Repeat
  Xbef:=Xaft;
  Xaft:=Xbef-f2(Xbef)/Exp(Xbef);
 Until ABS(Xbef-Xaft)<Epsilon2;
 WriteLn('The result of Newton calculation is ',Xaft);
 AV:=Ln(-b);
 WriteLn('The accurate value is               ',AV);
 WriteLn;
 WriteLn('Press "Enter" to continue...');
 ReadLn;

 {Здесь нужно инициализировать графический режим}
 ClearDevice;
 ScaleX:=600/(Xmax-Xmin);
 ScaleY:=400/(f1(Xmax)-f2(Xmin));
 Line(40,ROUND(f1(Xmax)*ScaleY),640,ROUND(f1(Xmax)*ScaleY));
 If Xmin>0 then
  Line(40,0,40,440)
 else
  Line(40-Round(Xmin*ScaleX),0,40-Round(Xmin*ScaleX),440);
 SetLineStyle(SolidLn,0,ThickWidth);
 SetColor(11);
 MoveTo(40,ROUND((f1(Xmax)-f1(Xmin))*ScaleY));
 X:=Xmin;
 Repeat
  X:=X+dX;
  LineTo(40+Round((X-Xmin)*ScaleX),ROUND((f1(Xmax)-f1(X))*ScaleY));
 Until ROUND(X*10000)=ROUND(Xmax*10000);
 SetColor(14);
 MoveTo(40,ROUND((f1(Xmax)-f2(Xmin))*ScaleY));
 X:=Xmin;
 Repeat
  X:=X+dX;
  LineTo(40+Round((X-Xmin)*ScaleX),ROUND((f1(Xmax)-f2(X))*ScaleY));
 Until ROUND(X*10000)=ROUND(Xmax*10000);
 ReadKey;
 CloseGraph;
END.
Вы уж не взыщите, но заниматься дальнейшим украшательством типа числовой разметки осей возможности нет.
Несколько пояснений:
Epsilon1 задает точность вычисления ряда Тейлора (кстати, на самом деле это просто разложение функции Exp(x)), Epsilon2 - точность определения корня уравнения методом Ньютона. Значения Xmax (верхний предел) следует брать небольшими, не выше 2 - 3.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070