Местами при реализации некоторых специальных функций, которые представлены разложением в степенной ряд, у меня случаются вообще тотальные дефекты, как дело доходит до построения графика написанной функции… Так вышло у меня с функцией Вейерштрасса (зачетная вещь, не имеющая производной на всей области определения), с которой я некоторое время мучился и получал вместо фракталоподобного графика рисунок, похожий на узор капроновых колготок (да, да, именно так и получалось)! Но потом все-таки (путем тотальной детализации расчетов) я таки разложил её в ряд на Icon!
И вот как это выглядит:
procedure weer(a,b,x)
local i,k,m,s
i:=0
s:=0
while i<10 do {
k:=cos(&pi*x*(a^i))
m:=b^i
s+:=k*m
i+:=1
}
return s
end
А вот что получается, если применить команду weer(2,0.5,i/200.0):
На всякий случай выкладываю полную версию кода, в которой помимо этой забавной функции вложен еще и один из интегралов Френеля:
link graphics,factors
procedure main()
local W,l,i,k
W:=WOpen("size=500,500")
grid_coord()
i:=-250
while i<250 do {
Fg("red")
DrawPoint(i+250,250-100*weer(2,0.5,i/200.0))
i+:=0.01
}
WDone()
end
procedure grid_coord()
local i
Fg("lightgray")
every i:=0 to 500 by 10 do {
DrawLine(i,0,i,500)
DrawLine(0,i,500,i)
}
Fg("black")
DrawLine(0,250,500,250)
DrawLine(250,0,250,500)
end
procedure weer(a,b,x)
local i,k,m,s
i:=0
s:=0
while i<10 do {
k:=cos(&pi*x*(a^i))
m:=b^i
s+:=k*m
i+:=1
}
return s
end
procedure frenel_s(x)
local s,i,a,b,c
s:=0
i:=0
while i<10 do {
a:=(-1)^i
b:=4*i+3
c:=a*(x^b)
d:=factorial(2*i+1)*b
s+:=c/d
i+:=1
}
return s
end