Нашла старую работу по моделированию экономики. Выложу, пожалуй.
Вот, непосредственно, задание.
Составить программу, которая:
1. Изображает кривую спроса D = α + AP и кривую предложения S = β + BP на плоскости, по оси абсцисс которой отложена цена P, а по оси ординат – количество сделок.
2. Вычисляет начальное предложение S(1) исходя из начального значения цены P(0) на момент времени T = 0.
3. Изображает маршрут «изменение цены → изменение числа сделок», который имеет вид «паутины», повторив несколько раз процессы (i) и (ii):
(i) определение P(t) таким образом, чтобы S(t) = S(P(t — 1) = D(t) = D(P(t));
(ii) нахождение S(t + 1) = S(P(t)), соответствующего P(t), T = 1, 2, …, TT.
Список переменных и функций:
AL = α, BE = β;
A – наклон кривой спроса (абсолютное значение в момент начала работы программы);
B – наклон кривой предложения;
PO – прежняя цена (цена периода 0 или цена предыдущего периода);
PN – новая цена (цена текущего периода);
SO – прежнее предложение (предложение текущего периода) ;
SN – новое предложение (предложение следующего периода) ;
D – спрос периода 0 или спрос текущего периода;
T – переменная-счетчик итераций (ТТ – максимальное число итераций);
C = 0 или 1 – число, указывающее направление, в котором следует тянуть паутину;
F(P) = D = α + AP, F(p) = S = β + BP.
Исходный код для построения паутинообразной модели:
float C[11]; for (i=0;i<=10;i++) { C[i]=50+LX/11*i; AnsiString S1 = FloatToStrF(0+((alfa/a)/10)*i,ffFixed,5,1); Image1->Canvas->TextOutA(C[i]-10,LY+5,S1); } float B[11]; for (i=0;i<=10;i++) { B[i]=35+LY/11*i; AnsiString S = FloatToStrF(alfa-(alfa/10)*i,ffFixed,5,1); Image1->Canvas->TextOutA(20,B[i],S); } D=alfa-a*p; S=beta+b*p; if(D>S) { Image1->Canvas->MoveTo(50,40); Image1->Canvas->LineTo(LX,LY); MasY=(LY-40)/alfa; MasX=(LX-50)*a/alfa; float S1=beta+b*alfa/a; Image1->Canvas->MoveTo(50+(-1*beta)/b*MasX,LY); Image1->Canvas->LineTo(LX,LY-S1*MasY); } if(S>D) { ShowMessage("Результат не сойдется"); } Image1->Canvas->MoveTo(50+p*MasX,LY-(alfa-a*p)*MasY); float pn = (alfa-beta)/(a+b); pN=p; while ((pN<=pn-1) || (pN>=pn+1)) { float pN1=pN; Image1->Canvas->LineTo(50+pN1*MasX,LY-(beta+b*pN1)*MasY); Image1->Canvas->LineTo(50+(alfa-b*pN1-beta)*1/a*MasX,LY-(beta+b*pN1)*MasY); pN=(alfa-b*pN1-beta)*1/a; } |
Результат работы программы: