Разработайте в VBA форму, реализующую нахождение значения определенного интеграла методом Симпсона с точностью 0,0001
Разработайте в VBA форму, реализующую нахождение значения определенного интеграла методом Симпсона с точностью 0,0001.
(Интеграл, сверху 1,2 снизу 0,4) (2x+1)sin(x)*dx
Буду благодарен, если кто-то сможет помочь. Это 3-е задание. Калькулятор я в VBA сделал и еще одно задание, а вот методом Симпсона не могу разобраться как делать.
По дате
По рейтингу
Намного более эффективный способ, чем предложила нейросеть. Но только вычисления - без работы с формой:
12345678910111213141516171819202122232425262728293031
Function f(x As Double) As Double
f = (2 * x + 1) * Sin(x)
End Function
Sub calc()
Dim a As Double, b As Double, x As Double
a = 0.4
b = 1.2
eps = 0.0001
h = (b - a) / 2#
s1 = f(a) + f(b)
s2 = f(a + h)
s4 = 0#
cur = (s1 + 2 * s2) * h / 3#
Do
prev = cur
s2 = s2 + s4
s4 = 0#
x = a + h / 2#
Do While x < b
s4 = s4 + f(x)
x = x + h
Loop
h = h / 2
cur = (s1 + 2 * s2 + 4 * s4) * h / 3#
Loop While Abs(cur - prev) >= eps
MsgBox cur
End Sub
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
' Функция вычисления подынтегрального выражения
Function f(x As Double) As Double
f = (2 * x + 1) * Sin(x)
End Function
' Метод Симпсона для заданного n
Function SimpsonMethod(a As Double, b As Double, n As Long) As Double
Dim h As Double
Dim sumOdd As Double, sumEven As Double
Dim i As Long
h = (b - a) / n
sumOdd = 0
sumEven = 0
For i = 1 To n - 1
If i Mod 2 = 1 Then
sumOdd = sumOdd + f(a + i * h)
Else
sumEven = sumEven + f(a + i * h)
End If
Next i
SimpsonMethod = (h / 3) * (f(a) + 4 * sumOdd + 2 * sumEven + f(b))
End Function
' Функция вычисления интеграла с заданной точностью
Function ComputeIntegral(a As Double, b As Double, epsilon As Double) As Double
Dim n As Long
Dim currentResult As Double, previousResult As Double
n = 2
currentResult = SimpsonMethod(a, b, n)
Do
previousResult = currentResult
n = n * 2
currentResult = SimpsonMethod(a, b, n)
Loop Until Abs(currentResult - previousResult) < epsilon
ComputeIntegral = currentResult
End Function
' Обработчик кнопки "Вычислить"
Private Sub CommandButton1_Click()
Dim a As Double, b As Double, epsilon As Double, result As Double
On Error GoTo ErrorHandler
a = CDbl(TextBox1.Text)
b = CDbl(TextBox2.Text)
epsilon = CDbl(TextBox3.Text)
If a >= b Then
MsgBox "Верхний предел должен быть больше нижнего."
Exit Sub
End If
result = ComputeIntegral(a, b, epsilon)
LabelResult.Caption = "Результат: " & Format(result, "0.0000")
Exit Sub
ErrorHandler:
MsgBox "Ошибка ввода. Убедитесь, что введены числа."
End Sub