Помогите найти ошибку в программе VBA: вычисление функции, график

Постановка задачи Написать оптимальную (по числу арифметических операций) программу для вычисления приведенной ниже функции. Построить график данной функции на отрезке [a; b] , а также график касательной к ней в точке с абсциссой хо
формула дана в приложенном изображенииСнимок
Ошибку выдает в последней части программы здесь:
For x = a To b Step h

Вот собственно сама программа

Public Sub zadanie2()
Dim a As Double, b As Double, h As Double, x0 As Double, namesh As String
namesh = "Лист2"
Worksheets(1).Select
a = -1: b = 1: h = 0.05: x0 = 0.2
Call Graphics(a, b, h, x0)
End Sub
Function Fun(x As String) As Double
Dim s As Double, i As Long, s1 As Single, s2 As Single, k As String
s = 0
For i = 1 To 15
s1 = 1 + 0.2 * i
s2 = 2 * i
k = k + (Sin(x ^ s1) / x ^ s2) - (Sin(x ^ s1 + 0.2) / x ^ (s2 + 0.2))
s = s + k
Next i
Fun = s
End Function

Function FunDiv(x As Double) As Double
Dim d As Double
d = 0.000001
FunDiv = (Fun(x + d) - Fun(x)) / d
End Function
Function FunTang(x As Double, x0 As Double) As Double
FunTang = Fun(x0) + FunDiv(x0) * (x - x0)
End Function

Sub Graphics(a As Double, b As Double, h As Double, x0 As Double)
Dim x As String, n As Long
n = 1
Cells(n, 1) = "X"
Cells(n, 2) = "ФУНКЦИЯ"
Cells(n, 3) = "КАСАТЕЛЬНАЯ"
For x = a To b Step h
n = n + 1
Cells(n, 1) = x
Cells(n, 2) = Fun(x)
Cells(n, 3) = FunTang(x, x0)
Next x
Range("A1:C63").Select
    Charts.Add
    ActiveChart.ChartType = xlXYScatterLinesNoMarkers
    ActiveChart.SetSourceData Source:=Sheets("Лист2").Range("A1:C63"), PlotBy:= _
        xlColumns
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Лист2"
    With ActiveChart
        .HasTitle = True
        .ChartTitle.Characters.Text = "График функции и касательной"
        .Axes(xlCategory, xlPrimary).HasTitle = False
        .Axes(xlValue, xlPrimary).HasTitle = False
    End With
End Sub

какую?

Вы икс уже как строку объявили

А далее пытаетесь его использовать как счётчик цикла с вещественными значениями:

For x = a To b Step h

Просто выделяется желтым цветом вот эта строка
Sub Graphics(a As Double, b As Double, h As Double, x0 As Double)
А потом синим ниже выделяет только х
For x = a To b Step h

Другими словами, так делать нельзя? Просто при задании x as Double, программа выдает ошибку в формуле с синусами и не хочет вычислять дальше

Ошибка “Несоответствие типов.”

Кроме того, использование вещественных аргументов в параметрах цикла допустимо, но не рекомендуется. ВБА их, конечно, округлит сам, но потом долго можете искать ошибку, почему у Вас циклы при некоторых параметрах не до конца выполняются.

Также нужно поменять тип икса в параметрах функции:
Function Fun(x As Double) As Double

и внутри неё - k тоже объявлен как строка:

k As Double

А ещё этот самый k нигде не инициализируется, то есть ему не присваивается начальное значение. Полагаю, что должно быть так:

s = 0
k = 0

При измене на Double, программа не хочет выполнять цикл. Именно поэтому я и написал в форум данную программу. При String выдает ошибку в конце программы, а при Double программа не выполняет цикл

Сейчас попробую.

Снимок
все равно выдает ошибку

Эта ошибка - деление на ноль.
видимо, в цикле наступает момент, когда знаменатель дроби равен нулю.

а откуда взялся X ^ S2 ?!?!
там же банально 2 в степени.

и ещё.
вот это

означает, что нужно вычислять следующий член ряд реккурентно (исходя из предыдущего) - для этого нужно разделить второй член ряда на первый, полученное число и использовать в цикле.

Это потому что у Вас формула неправильно описана в функции.

В знаменателе должно быть 2 в степени s2, а не икс.

И цикл, кстати, должен быть от 1 до 16, а не до 15

1 лайк

Спасибо большое за помощь

Программа заработала, только вот графика нет

У Вас таблица значений формируется на 1 листе, а график ищет её на втором:

    ActiveChart.SetSourceData Source:=Sheets("Лист2").Range("A1:C63"), PlotBy:= _
1 лайк

Молодец! :+1:

@Hotmal,

Public Sub zadanie2()
Dim a As Double, b As Double, h As Double, x0 As Double
Worksheets("Лист2").Select

Спасибо большое

Спасибо Вам большое

а тот цикл:
For x = a To b Step h
все равно же не правильно отработает, округлив все к целому, не ?