Top.Mail.Ru
Ответы

Разработайте в VBA форму, реализующую нахождение значения определенного интеграла методом Симпсона с точностью 0,0001

Разработайте в VBA форму, реализующую нахождение значения определенного интеграла методом Симпсона с точностью 0,0001.
(Интеграл, сверху 1,2 снизу 0,4) (2x+1)sin(x)*dx
Буду благодарен, если кто-то сможет помочь. Это 3-е задание. Калькулятор я в VBA сделал и еще одно задание, а вот методом Симпсона не могу разобраться как делать.

По дате
По рейтингу
Аватар пользователя
Высший разум
5мес

Намного более эффективный способ, чем предложила нейросеть. Но только вычисления - без работы с формой:

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 
Аватар пользователя
Оракул
5мес
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