Form1.Picture1.CurrentX = tmp - 15 'установка текущего значения координаты пера по оси x
Form1.Picture1.CurrentY = sh - 40 'установка текущего значения координаты пера по оси y
Form1.Picture1.Print tmp 'вывод подписи при зесечке
Next tmp 'конец цикла
Form1.Picture1.DrawWidth = 2 'установка жирного пера
For n = 10 To 200 Step 10 'цикл - разное количество шагов
sp = 0 'начальное значение интеграла
st = 0 'начальное значение интеграла
For x = a To b - 0.000001 Step (b - a) / n 'цикл - вычисление интеграла
sp = sp + f(x) * (b - a) / n 'формула левых прямоугольников
Next x 'конец цикла
i = 1
Do While i <= n
x = a + (b - a) * i / n
st = st + (b - a) * (f(x - 2 * (b - a) / n) + 4 * f(x - (b - a) / n) + f(x)) / (3 * n) 'формула симпсона
'st = st + (b - a) * 2 * (f(x) + 2 * f(x - 1 / n)) / (3 * n) 'формула симпсона
i = i + 2
Loop
yp = sh - Abs(sp - r) 'вычисление координаты точки, соответствующей sp
yt = sh - Abs(st - r) 'вычисление координаты точки, соответствующей st
Form1.Picture1.ForeColor = QBColor(3) 'установка морской волны цвета линии
Form1.Picture1.Line (n - 20, Abs(yp1) / 10)-(n - 10, Abs(yp) / 10) 'рисование части линии
Form1.Picture1.ForeColor = QBColor(10) 'установка зеленого цвета линии
Form1.Picture1.Line (n - 20, Abs(yt1) / 10)-(n - 10, Abs(yt) / 10) 'рисование части линии
yp1 = yp 'сохранение текущего результата для следующей итерации
yt1 = yt 'сохранение текущего результата для следующей итерации
Next n 'конец цикла
Form1.Show (1)
End Sub
рис 4. Исследование сходимости разных методов
Private Sub simpson_Click()
Dim n As Integer, k As Integer
Dim y As Double, y1 As Double, x As Double, r As Double, s As Double
Dim tmp As Double, minf As Double, maxf As Double
Dim a As Double, b As Double, sw As Double, sh As Double
Dim q As Double, q1 As Double, aq As Double, bq As Double, cq As Double
Dim h As Double, x1q As Double, x2q As Double, x3q As Double, zv As Double, kor As Double
a = Val(Form4.Text1.Text) 'чтение введённого значения a
b = Val(Form4.Text2.Text) 'чтение введённого значения b
n = Val(Form4.Text3.Text) 'чтение введённого значения n
If (n <= 0) Or (a >= b) Then 'проверка корректности данных
MsgBox ("Введены некорректные данные") 'вывод сообщения об ошибке
Exit Sub 'выход из функции
End If 'конец проверки
sw = b - a 'вычисление масштаба по оси x
kor = ((-18 + 6 * 33 ^ (1 / 2.5)) ^ (1 / 2.5)) / 6
minf = f(a)
maxf = f(a)
If minf > f(b) Then minf = f(b)
If maxf < f(b) Then maxf = f(b)
If (a >= kor) And (b <= kor) Then
If minf > f(kor) Then minf = f(kor)
If maxf < f(kor) Then maxf = f(kor)
End If
If (a >= -kor) And (b <= -kor) Then
If minf > f(-kor) Then minf = f(-kor)
If maxf < f(-kor) Then maxf = f(-kor)
End If
sh = maxf - minf 'вычисление масштаба по оси y
zv = maxf
If maxf < 0 Then zv = 0
If minf > 0 Then zv = sh
r = (Log((b ^ 2 + 1) / (b ^ 2 + 2.5)) - Log((a ^ 2 + 1) / (a ^ 2 + 2.5))) 'реальное значение
Form5.Picture1.Cls 'очистка области рисования
Form5.Picture1.DrawWidth = 1 'установка тонкого пера
Form5.Picture1.ScaleWidth = sw 'установка масштаба по оси x
Form5.Picture1.ScaleHeight = sh 'установка масштаба по оси y
For tmp = minf To maxf Step sh / 10 'цикл - рисование засечек по оси y
Form5.Picture1.Line (0, maxf - tmp)-(sw / 40, maxf - tmp) ' рисование засечки в точке tmp
Form5.Picture1.CurrentX = sw / 40 'установка текущего значения координаты пера по оси x
Form5.Picture1.CurrentY = maxf - tmp 'установка текущего значения координаты пера по оси y
Form5.Picture1.Print Format(tmp, "#0.00") 'вывод подписи при зесечке с двумя знаками после запятой
Next tmp 'конец цикла
Form5.Picture1.Line (0, zv)-(sw, zv)
For tmp = a To b Step sw / 10 'цикл - рисование засечек по оси x
Form5.Picture1.Line (tmp - a, zv)-(tmp - a, zv - sh / 40) ' рисование засечки в точке tmp
Form5.Picture1.CurrentX = tmp - a 'установка текущего значения координаты пера по оси x
Form5.Picture1.CurrentY = zv - sh / 20 'установка текущего значения координаты пера по оси y
Form5.Picture1.Print Format(tmp, "#0.00") 'вывод подписи при зесечке с двумя знаками после запятой
Next tmp 'конец цикла
s = 0 'начальное значение интеграла
y1 = f(a) 'начальное значение функции
Form5.Picture1.DrawWidth = 2 'установка жирного пера
For k = 1 To 500 'цикл - рисование графика функции
x = a + (b - a) * k / 500 'вычисление x
y = f(x) 'вычисление y
Form5.Picture1.Line (x - a - (x - a) / 500, maxf - y1)-(x - a, maxf - y) 'рисование части графика
y1 = y 'запоминание текущего результата для использывания на следующем шаге
Next k 'конец цикла
y1 = f(a) 'начальное значение функции
Form5.Picture1.DrawWidth = 1 'установка тонкого пера
k = 2
Do While k <= n 'цикл - вычисление интеграла и рисование графика
x = a + (b - a) * k / n 'вычисление x
y = f(x) 'вычисление y
Form5.Picture1.Line (x - 2 * (b - a) / n - a, zv)-(x - 2 * (b - a) / n - a, maxf - y1) 'рисование левой стороны криволинейной трапеции
x1q = x - 2 * (b - a) / n
x2q = x - (b - a) / n
x3q = x
h = (b - a) / n
aq = (f(x1q) - 2 * f(x2q) + f(x3q)) / (2 * h * h) 'вычисление коэффициентов параболы
bq = (f(x3q) - f(x1q)) / (2 * h) - aq * (x1q + x3q) 'вычисление коэффициентов параболы
cq = f(x1q) - aq * x1q * x1q - bq * x1q 'вычисление коэффициентов параболы
For q = x1q To x3q Step h / 10 ' рисование параболы
Form5.Picture1.Line (q - h / 10 - a, maxf - (aq * (q - h / 10) * (q - h / 10) + bq * (q - h / 10) + cq))-(q - a, maxf - (aq * q * q + bq * q + cq))
Next q