PDA

Просмотр полной версии : Задача на паскале:функция распределения



blackw00d
04.05.2008, 09:21
Нужно написать программу, которая расчитывает функцию распределения и строит график ее функции

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

вот код программы, нужно поменять или дописать процедуру t, там коэфиценты mx и my не правильно расчитаны


program zakon;
uses
crt,graph;
var
i,j,Ny,N,dg,dm:integer;
a,b,m,f,h,x:real;

procedure setka;
var
k,n:integer;
begin
dg:=detect;
initgraph(dg,dm,'..\bgi');
cleardevice;
line((getmaxx div 2)-300,getmaxy div 2,(getmaxx div 2)+300,getmaxy div 2);
line(getmaxx div 2,(getmaxy div 2)-200,getmaxx div 2,(getmaxy div 2)+200);
moveto(getmaxx div 2,getmaxy div 2);
end;

procedure t(x,f,a,b,h:real);
var
k,xg,yg:integer;
mx,my:real;
begin
mx:=(getmaxx-1)/sqrt((b-a)/h);
my:=(getmaxy-1)/sqrt((b-a)/h)
xg:=(getmaxx div 2)+trunc(mx*x);
yg:=(getmaxy div 2)-trunc(my*f);
setcolor(green);
lineto(xg,yg);
putpixel(xg,yg-1,red);
end;

begin
repeat
clrscr;
write('Vvedite a=');
readln(a);
write('Vvedite b=');
readln(b);
writeln('Vvedite hag=');
readln(h);
until (a<b) and (h<=b-a);
writeln('Vvedite kol-vo experimentov ');
readln(N);
x:=a;
i:=0;
setka;
repeat
Ny:=0;
randomize;
for j:=1 to N do
begin
m:=random;
if m<x
then
inc(Ny);
end;
f:=Ny/N;
t(x,f,a,b,h);
inc(i);
x:=a+i*h;
until x>b;
readln;
end.


помогите плиз. :rolleyes:

Хыиуду
04.05.2008, 11:23
Не совсем понятно, как все-таки рассчитывается функция, из-за того, что у вас смешаны собственно функциональные вычисления и преобразования функции к координатам экрана. Могу предложить такой вариант: пройти все шаги, на каждом шагу значения занести в массив, потом найти максимальные (по модулю) значения, исходя из них выбрать масштаб и построить график по массиву.

blackw00d
04.05.2008, 13:07
функция расчитывается здесь

repeat
Ny:=0;
randomize;
for j:=1 to N do
begin
m:=random;
if m<x
then
inc(Ny);
end;
f:=Ny/N;
t(x,f,a,b,h);
inc(i);
x:=a+i*h;
until x>b;


вычисляется N чисел случайным образом, и если это число входи в промежуток [a,x], то увеличивается счетчик, в конце цикла из N раз расчитывается функция распределения f, значения x,f посылаются в процедуру рисования.

На счет твоего предложения о массиве, ведь неизвестно сколько будет в нем элементов, сколько брать array [...] of ....

и по каким формулам потом расчитать масштаб и шаг, можешь написать в кратце.

спс.