Постановка задачи Написать оптимальную (по числу арифметических операций) программу для вычисления приведенной ниже функции. Построить график данной функции на отрезке [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
Просто выделяется желтым цветом вот эта строка
Sub Graphics(a As Double, b As Double, h As Double, x0 As Double)
А потом синим ниже выделяет только х
For x = a To b Step h
Кроме того, использование вещественных аргументов в параметрах цикла допустимо, но не рекомендуется. ВБА их, конечно, округлит сам, но потом долго можете искать ошибку, почему у Вас циклы при некоторых параметрах не до конца выполняются.
Также нужно поменять тип икса в параметрах функции: Function Fun(x As Double) As Double
и внутри неё - k тоже объявлен как строка:
k As Double
А ещё этот самый k нигде не инициализируется, то есть ему не присваивается начальное значение. Полагаю, что должно быть так:
При измене на Double, программа не хочет выполнять цикл. Именно поэтому я и написал в форум данную программу. При String выдает ошибку в конце программы, а при Double программа не выполняет цикл
а откуда взялся X ^ S2 ?!?!
там же банально 2 в степени.
и ещё.
вот это
означает, что нужно вычислять следующий член ряд реккурентно (исходя из предыдущего) - для этого нужно разделить второй член ряда на первый, полученное число и использовать в цикле.