Автор: Пользователь скрыл имя, 21 Января 2013 в 21:40, лабораторная работа
Цель работы: построить график функции в среде разработки Visual Basic.NET.
Будем считать, что на рынке одного товара функция спроса и функция предложения – линейные функции цены на момент времени или цены предыдущего момента времени.
Составить программу, которая:
1. Изображает кривую спроса и кривую предложения на плоскости, по оси абсцисс которой отложена цена , а по оси ординат – количество сделок.
2. Вычисляет начальное предложение исходя из начального значения цены на момент времени .
3. Изображает маршрут "изменение цены → изменение числа сделок", который имеет вид "паутины", повторив несколько раз процессы.
Imports System.Math
Imports System.Drawing.Drawing2D
Public Class Form1
Public Sub построение_графика(ByVal sinX(,) As Single, ByVal sinY(,) As Single, ByVal кол_во_ГРАФИКОВ As Integer, ByVal подпись_Y As String, ByVal подпись_Х As String)
Dim xmin, xmax, ymax, ymin As Single
Dim высота_граф, ширина_граф As Single
Dim i As Integer = 0
Dim g As Graphics = PB.CreateGraphics
Dim n As Integer = 1000 ' Размерность массива
g.Clear(Color.White)
xmin = 999999 : xmax = 0
ymin = 9999
For i = 1 To кол_во_ГРАФИКОВ
For j = 0 To n
If xmin > sinX(i, j) And sinY(i, j) > 0 Then : xmin = sinX(i, j)
End If
If xmax < sinX(i, j) Then : xmax = sinX(i, j)
End If
If ymin > sinY(i, j) Then : ymin = sinY(i, j)
End If
If ymax < sinY(i, j) Then : ymax = sinY(i, j)
End If
Next
Next
высота_граф = PB.Height - 120 : ширина_граф = PB.Width - 100 - 40
g.DrawLine(Pens.Black, 50, высота_граф + 50, 50 + ширина_граф + 30, высота_граф + 50)
g.DrawLine(Pens.Black, 50 + ширина_граф + 20, высота_граф + 45, 50 + ширина_граф + 30, высота_граф + 50)
g.DrawLine(Pens.Black, 50 + ширина_граф + 20, высота_граф + 55, 50 + ширина_граф + 30, высота_граф + 50) ' ось Х
g.DrawLine(Pens.Black, 50, высота_граф + 50, 50, 30)
g.DrawLine(Pens.Black, 45, 40, 50, 30)
g.DrawLine(Pens.Black, 55, 40, 50, 30) ' ось У
For i = 1 To кол_во_ГРАФИКОВ
For j = 1 To n
If sinY(i, j) = 0 Then
Exit For
End If
g.DrawLine(Pens.Green, 50 + Abs(sinY(i, j - 1) - ymin) * (ширина_граф / (ymax - ymin)), _
50 + высота_граф - Abs(sinX(i, j - 1) - xmin) * (высота_граф / (xmax - xmin)), _
50 + Abs(sinY(i, j) - ymin) * (ширина_граф / (ymax - ymin)), _
50 + высота_граф - Abs(sinX(i, j) - xmin) * (высота_граф / (xmax - xmin)))
Next
Next
Dim myFont = New Font("Arial", 12, FontStyle.Bold)
Dim myFont1 = New Font("Arial", 8, FontStyle.Regular)
Dim myBrush = New SolidBrush(Color.Black)
' вывод значений графика
g.DrawString(подпись_Х, myFont, myBrush, 10, 20)
g.DrawString(подпись_Y, myFont, myBrush, 50 + ширина_граф + 20, высота_граф + 50)
Dim шаг_для_надписей_по_высоте,
шаг_для_надписей_по_
For i = 0 To 10
шаг_для_надписей_по_высоте = 50 + высота_граф - высота_граф / 10 * i
g.DrawString(Format(CStr((xmax - xmin) / 10 * i) + xmin, "Fixed"), myFont1, myBrush, 3, шаг_для_надписей_по_высоте - 10)
g.DrawLine(Pens.Red, 45, шаг_для_надписей_по_высоте, 55, шаг_для_надписей_по_высоте)
шаг_для_надписей_по_
g.DrawLine(Pens.Red, шаг_для_надписей_по_
g.DrawString(Format(CStr((ymax - ymin) / 10 * i), "Fixed"),
myFont1, myBrush, шаг_для_надписей_по_
Next
End Sub
Dim xn, xsh, xl As Single
Public SinX(1000, 1000), sinY(1000, 1000) As Single
Private Sub Кривая_доход_потребление_
Dim U, b(3), P(3), Qmin, Qmaxs, Q As Single
Dim xz(3), x1, x2 As Single
Dim количество_графиков As Integer = CInt(Kol_voGR.Text)
Dim indmas As Integer = 0
Array.Clear(SinX, 0, 10201)
Array.Clear(sinY, 0, 10201)
Dim n As Integer = 1000 ' Размерность массива
b(1) = CSng(B1bt.Text) : b(2) = CSng(B2tb.Text)
P(1) = CSng(P1tb.Text) : P(2) = CSng(P2tb.Text)
Qmaxs = CSng(Qmaxstb.Text) : Qmin = CSng(Qmintb.Text)
For график = 1 To количество_графиков
Q = Qmin + (Qmaxs - Qmin) / (количество_графиков - 1) * (график - 1)
For i = 1 To 2
xz(i) = (Q / P(i)) * (b(i) / (b(1) + b(2))) ' точки касания
Next
U = b(1) * Log(xz(1)) + b(2) * Log(xz(2))
If CSng(TextBox1.Text) > U Then
TextBox1.Text = U.ToString
End If
If CSng(TextBox2.Text) < U Then
TextBox2.Text = U.ToString
End If
For i = 1 To 450 Step 450 / n 'кривая доход потребление
x1 = i
x2 = ((Exp(U)) / ((x1) ^ b(1))) ^ (1 / b(2))
If x2 <= 400 Then
SinX(график, indmas) = x2
sinY(график, indmas) = x1
indmas += 1
End If
Next
indmas = 0
For i = 1 To 2000
If (Q - P(1) * i) / P(2) <= -1 Then
Exit For
End If
SinX(количество_графиков + график + 1, indmas) = (Q - P(1) * i) / P(2) + 1
sinY(количество_графиков + график + 1, indmas) = i - 1
indmas += 1
Next
indmas = 0
For i = Qmin / 2 To Qmaxs + 100 Step (Qmaxs + 100 - Qmin / 2) / n '
линия соединяющая точки
For j = 1 To 2
xz(j) = (i / P(j)) * (b(j) / (b(1) + b(2)))
Next
SinX(количество_графиков + 1, indmas) = xz(2)
sinY(количество_графиков + 1, indmas) = xz(1)
indmas += 1
Next
indmas = 0
Next
построение_графика(SinX, sinY, CInt(Kol_voGR.Text) * 2 + 1, "X(1)", "X(2)")
End Sub
Private Sub Кривая_доход_потреб_в_зав_от_
Dim U, b(3), P(3), Qmin, Qmaxs, Q As Single
Dim xz(3), x1, x2 As Single
Dim количество_графиков As Integer = CInt(Kol_voGR.Text)
Dim indmas As Integer = 0
Array.Clear(SinX, 0, 10201)
Array.Clear(sinY, 0, 10201)
Dim n As Integer = 1000 ' Размерность массива
b(1) = CSng(B1bt.Text) : b(2) = CSng(B2tb.Text)
P(1) = CSng(P1tb.Text) : P(2) = CSng(P2tb.Text)
Qmaxs = CSng(Qmaxstb.Text) : Qmin = CSng(Qmintb.Text)
For график = 1 To количество_графиков
b(1) = 0.5 + 0.05 * Sin(Q / 40)
Q = Qmin + (Qmaxs - Qmin) / (количество_графиков - 1) * (график - 1)
For i = 1 To 2
xz(i) = (Q / P(i)) * (b(i) / (b(1) + b(2))) ' точки касания
Next
U = b(1) * Log(xz(1)) + b(2) * Log(xz(2))
For i = 1 To 450 Step 450 / n 'кривая доход потребление
x1 = i
x2 = ((Exp(U)) / ((x1) ^ b(1))) ^ (1 / b(2))
If x2 <= 400 Then
SinX(график, indmas) = x2
sinY(график, indmas) = x1
indmas += 1
End If
Next
indmas = 0
For i = 1 To 2000
If (Q - P(1) * i) / P(2) <= -1 Then
Exit For
End If
SinX(количество_графиков + график + 1, indmas) = (Q - P(1) * i) / P(2) + 1
sinY(количество_графиков + график + 1, indmas) = i - 1
indmas += 1
'(Q - P(1) * i) / P(2) + 1
Next
indmas = 0
indmas = 0
Next
For i = Qmin / 2 To Qmaxs + 100 Step (Qmaxs + 100 - Qmin / 2) / n ' линия соединяющая точки касания
b(1) = 0.5 + 0.05 * Sin(i / 40)
For j = 1 To 2
xz(j) = i * b(j) / P(j) / (b(1) + b(2))
Next
SinX(количество_графиков + 1, indmas) = xz(2)
sinY(количество_графиков + 1, indmas) = xz(1)
indmas += 1
Next
построение_графика(SinX, sinY, CInt(Kol_voGR.Text) * 2 + 1, "X(1)", "X(2)")
End Sub
Private Sub Кривая_цены_потребление_Click(
Dim U, b(3), P(3), Qmin, Qmaxs, Q As Single
Dim xz(3), x1, x2 As Single
Dim количество_графиков As Integer = CInt(Kol_voGR.Text)
Dim indmas As Integer = 0
Array.Clear(SinX, 0, 10201)
Array.Clear(sinY, 0, 10201)
Dim n As Integer = 1000 ' Размерность массива
b(1) = CSng(B1bt.Text) : b(2) = CSng(B2tb.Text)
P(1) = CSng(P1tb.Text) : P(2) = 1.5
Qmaxs = CSng(Qmaxstb.Text) : Qmin = CSng(Qmintb.Text)
For график = 1 To количество_графиков
P(1) = 1000 / количество_графиков * график
Q = 400
For i = 1 To 2
xz(i) = (Q / P(i)) * (b(i) / (b(1) + b(2))) ' точки касания
Next
U = b(1) * Log(xz(1)) + b(2) * Log(xz(2))
If CSng(TextBox1.Text) > U Then
TextBox1.Text = U.ToString
End If
If CSng(TextBox2.Text) < U Then
TextBox2.Text = U.ToString
End If
For i = 0.001 To 2 Step 2 / n 'кривая доход потребление
x1 = i
x2 = ((Exp(U)) / ((x1) ^ b(1))) ^ (1 / b(2))
If x2 <= 400 Then
SinX(график, indmas) = x2
sinY(график, indmas) = x1
indmas += 1
End If
Next
indmas = 0
For i = 0.001 To 5 Step 5 / n ' бюджетная линия
If (Q - P(1) * i) / P(2) <= 1 Then
Exit For
End If
SinX(количество_графиков + график + 1, indmas) = (Q - P(1) * i) / P(2)
sinY(количество_графиков + график + 1, indmas) = i
indmas += 1
Next
indmas = 0
Next
indmas = 0
For i = 200 To 1200 Step (1000) / n ' линия соединяющая точки касания
xz(1) = (400 / i) * (b(1) / (b(1) + b(2)))
xz(2) = (400 / P(2)) * (b(2) / (b(1) + b(2)))
SinX(количество_графиков + 1, indmas) = xz(2)
sinY(количество_графиков + 1, indmas) = xz(1)
indmas += 1
Next
построение_графика(SinX, sinY, CInt(Kol_voGR.Text) * 2 + 1, "X(1)", "X(2)")
End Sub
Private Sub Кривая_цены_потреб_в_зав_от_
Dim U, b(3), P(3), Qmin, Qmaxs, Q As Single
Dim xz(3), x1, x2 As Single
Dim количество_графиков As Integer = CInt(Kol_voGR.Text)
Dim indmas As Integer = 0
Array.Clear(SinX, 0, 10201)
Array.Clear(sinY, 0, 10201)
Dim n As Integer = 1000 ' Размерность массива
'b(1) = CSng(B1bt.Text) :
b(2) = CSng(B2tb.Text)
P(1) = CSng(P1tb.Text) : P(2) = 1.5
Qmaxs = CSng(Qmaxstb.Text) : Qmin = CSng(Qmintb.Text)
For график = 1 To количество_графиков
P(1) = 1000 / количество_графиков * график
b(1) = 1 / (Sqrt(P(1)))
Q = 400
For i = 1 To 2
xz(i) = (Q / P(i)) * (b(i) / (b(1) + b(2))) ' точки касания
Next
U = b(1) * Log(xz(1)) + b(2) * Log(xz(2))
If CSng(TextBox1.Text) > U Then
TextBox1.Text = U.ToString
End If
If CSng(TextBox2.Text) < U Then
TextBox2.Text = U.ToString
End If
For i = 0.001 To 0.28 Step 0.28 / n 'кривая доход потребление
x1 = i
x2 = ((Exp(U)) / ((x1) ^ b(1))) ^ (1 / b(2))
If x2 <= 400 Then
SinX(график, indmas) = x2
sinY(график, indmas) = x1
indmas += 1
End If
Next
indmas = 0
For i = 0.001 To 3 Step 3 / n ' бюджетная линия
If (Q - P(1) * i) / P(2) <= 225 Then
Exit For
End If
SinX(количество_графиков + график + 1, indmas) = (Q - P(1) * i) / P(2)
sinY(количество_графиков + график + 1, indmas) = i
indmas += 1
Next
indmas = 0
Next
indmas = 0
For i = 200 To 5400 Step (5400 - 200) / n ' линия соединяющая точки касания
P(1) = i
b(1) = 1 / (Sqrt(P(1)))
xz(1) = (400 / i) * (b(1) / (b(1) + b(2)))
xz(2) = (400 / P(2)) * (b(2) / (b(1) + b(2)))
SinX(количество_графиков + 1, indmas) = xz(2)
sinY(количество_графиков + 1, indmas) = xz(1)
indmas += 1
Next
построение_графика(SinX, sinY, CInt(Kol_voGR.Text) * 2 + 1, "X(1)", "X(2)")
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class