IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Помогите с графической частью..., Вычисление интеграла методом симпсона 3/8. Маштабирование
Роман
сообщение 22.05.2011 8:41
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Роман

Репутация: -  0  +


Вычисление интеграла методом симпсона 3/8
Вот задание:
Исходные данные:
Число уравнений 3. y=a*x^3+b*x+c; y=a*sin(x+b)+c; y=a*ln|x+b|+c; Коэффициенты a, b, c вещественные числа задаются с клавиатуры. Пределы интегрирования – вещественные числа, лежащие в пределах от –1000 до 1000. Число интервалов разбиения не более 500.
Отобразить на экране в графическом режиме с учетом масштабирования процесс вычисления интеграла. Выдать на экран точное и приближенное значения интеграла, погрешность вычисления.
Вот я написал код программы. Все работает, строит графики, но во второй функции (синусоида) иногда, при некоторых коэффициентах сбивается масштабирование, причем сбивается по оси Y(выходит за пределы экрана). Подписи под осями тоже не всегда отображаются. И еще когда вводишь число разбиений разное, почему-то значение интеграла не меняется... Поэтому сделал фиксированное...
Вот собственно код:


program simps3_8;
uses crt,graph;
type
funct = function (x:real):real;
var
a,b,i,q,w,c,err,Ir:real;
n:integer;
j:char;
function f1(x:real):real;far;
begin
f1:=q*x*x*x+w*x+c;
end;

function f2(x:real):real;far;
begin
f2:=q*sin(x+w)+c;
end;

function f3(x:real):real;far;
begin
f3:=q*ln(abs(x+w))+c;
end;

procedure Simps(f1:funct; a,b:real; var I:real);
var
x,h,q,w,c:real;
e,m,n:integer;
begin
i:=0;
x:=a;
h:=(b-a)/n;
I:=(3*h/8)*(f1(x)+f1(b));
for e:=1 to n-1 do begin
if (e mod 3=0) then
m:=2 else m:=3;
x:=x+h;
I:=I+(3*h*m*f1(x)/8);
end;
end;

procedure out_grp(f1:funct;xmin,xmax,ymin,ymax:real);
var
drv,mode:integer;
mx,my:real;
xx,yy:real;
sx:real;
dltx,dlty:integer;
s:string;
begin
drv:=VGA;
mode:=VGAHi;
initgraph(drv,mode,'');
ymin:=ymin/10;
if (xmin/xmax)>0.1 then dltx:=20 else dltx:=0;
if (ymin/ymax)>0.1 then dlty:=20 else dlty:=0;
mx:=500/(xmax-xmin);
my:=400/(ymax-ymin);
sx:=(xmax-xmin)/550;
settextjustify(1,1);
xx:=xmin;
repeat
setcolor(1);
line(trunc(40+mx*(xx-xmin)+dltx),20,trunc(40+mx*(xx-xmin)+dltx),469);
str(xx:4:2,s);
setcolor(15);
outtextxy(trunc(40+mx*(xx-xmin)+dltx),475,s);
xx:=xx+50*sx;
until (xx>(xmax+50*sx));
yy:=ymin+(ymax-ymin)/10;
repeat
setcolor(1);
line(41,trunc(470-my*(yy-ymin)-dlty),630,trunc(470-my*(yy-ymin)-dlty));
str(yy:4:2,s);
setcolor(15);
outtextxy(20,trunc(470-my*(yy-ymin)-dlty),s);
yy:=yy+(ymax-ymin)/10;
until (yy>(ymax+(ymax-ymin)/10));
line(40,0,40,480);
line(0,470,640,470);
line(40,0,38,10);
line(40,0,42,10);
line(640,470,630,472);
line(640,470,630,468);
xx:=xmin;
repeat
yy:=f1(xx);
putpixel(trunc(40+mx*(xx-xmin)+dltx),trunc(470-my*(yy-ymin)-dlty),7);
xx:=xx+sx;
until (xx>xmax);
outtextxy(300,10,' Press ESC to continue ');
outtextxy(635,455,'X');
outtextxy(20,10,'Y');
repeat until (readkey=#27);
closegraph;
end;

begin
clrscr;
writeln('Введите коэффициенты уравнения a,b,c');
readln(q,w,c);
writeln('Введите нижний и верхний пределы интегрирования');
readln(a,b);
if (a>1000) or (a<-1000) or (b>1000) or (b<-1000) then begin
writeln('Превышен допустимый предел, нажмите любую клавишу чтобы выйти');
readkey;
exit;
end;
n:=500;
writeln('Выберите функцию:');
writeln('Нажмите 1, чтобы выбрать функцию:',q:5:2,'*x^3+',w:5:2,'*x+',c:5:2);
writeln(' Нажмите 2, чтобы выбрать функцию:',q:5:2,'*sin(x+',w:5:2,')+',c:5:2);
writeln(' Нажмите 3, чтобы выбрать функцию:',q:5:2,'*ln|x+',w:5:2,'|+',c:5:2);
j:=readkey;
if(j=#49) then begin
simps(f1,a,b,i);
Ir:=(q*b*b*b*b/4+w*b*b/2+c*b)-(q*a*a*a*a/4+w*a*a/2+c*a);
err:=abs(I-Ir)/I*100;
out_grp(f1,a,b,f1(a),f1(b));
end;
if(j=#50) then begin
simps(f2,a,b,i);
Ir:=(c*b-q*cos(b+w))-(c*a-q*cos(a+w));
err:=abs(I-Ir)/I*100;
out_grp(f2,a,b,f2(a),f2(b));
end;
if(j=#51) then begin
simps(f3,a,b,i);
Ir:=(c*b-q*(b+w)+q*(b+w)*ln(b+w))-(c*a-q*(a+w)+q*(a+w)*ln(a+w));
err:=abs(I-Ir)/I*100;
out_grp(f3,a,b,f3(a),f3(b));
end;
writeln('Приближенное значение интеграла I=',i:15:11);
writeln('Точное значение интеграла I=',Ir:15:11);
writeln('error =',err:15:11,' %');
writeln('Число интервалов: ',n);
readkey;
end.


Простите что нету комментариев((( еще не успел....
Был бы очень признателен если хотя бы подредактировали только графическую часть. Т.е. процедуру out_grp; Т.к. я плохо там всё понимаю и писал её на примере другой программы.
Я часть с подсчетом интеграла мне понятна и вполне устраивает.

Сообщение отредактировано: Роман - 22.05.2011 11:36
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 21:24
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"