以线性函数y=x为例:
'非对称3-4-5逼近
dim a,b,h,i
a=0
b=3141592.6535893
h=1
k=2
do while abs(a-b)>0.0000001
do while a<b
a=a+k*h
h=k*h
i=i+1
loop
k=1
h=0.3*h
a=a-h
i=i+1
do while a>b
a=a-k*h
h=k*h
i=i+1
loop
k=1
h=0.4*h
a=a+h/2
i=i+1
loop
msgbox(a&"逼近次数:"&i)
0 1 3 7 5 4 3.5 3.25 3.125 3.1875 3.15875 3.141875 ...
% +1+2+4 -2 -1 0.25 -.125 -0.0625 -0.03125 0.015625 0.0078125 0.00390625
'快速折半逼近,此算法最具挖掘潜力。。。
a=0
b=3.141592653
h=1
Do While Abs(a-b)=>1
a=Sgn(b-a)*Sgn(h)*h+a
h=h*Sgn(b-a)*2^Sgn(b-a)
i=i+1
Loop
Do While Abs(a-b)>0.000001
a=a-Sgn(a-b)*h:h=h/2
i=i+1
Loop
MsgBox(a&"逼近次数:"&i)
'非对称3-4-5加速逼近
dim a,b,h,i
a=0
b=3141592.6535893
h=1
k=2
do while abs(a-b)>0.0000001
do while a<b
a=a+k*h:h=k*h
i=i+1
loop
if a>b then
k=1:h=0.5*h:a=a-h
i=i+1
end if
do while a>b
a=a-k*h:h=k*h
i=i+1
loop
if a<b then
k=1:h=0.5*h:a=a+h
i=i+1
end if
loop
msgbox(a&"逼近次数:"&i)
'y=x快速折半逼近
'只要单调,且有根,直接算出根
a=2000.5:b=211.9456
h=1 '初始步长为1
i=0
Do While Abs(a-b)>0.001
if (a-b)*(a+Sgn(b-a)*h)>0 then
h=2*h
else
h=h/2
end if
i=i+1
a=a+Sgn(b-a)*h
'msgbox a
Loop
MsgBox(a&"逼近次数:"&i)
'y=x快速折半逼近
'只要单调,且有根,直接算出根
a=0.1
b=3.141515926
h=1 '初始步长为1
i=0
fa=log(a) '************log
faa=fa+1
Do While Abs(fa-b)>0.0000001
if (fa-b)*(faa-b)>0 then
h=2*h
else
h=h/3
end if
i=i+1
a=a+Sgn(b-fa)*h
faa=fa
fa=log(a) '*************log
'msgbox(a&"--"&fa)
'msgbox fa
Loop
MsgBox(a&"逼近次数:"&i)
'优化对分法,
'单调递减函数
h=0.5
k=2
p=1.2
a=0
i=0
tmp=a
if 0.5^(a)<>p then
a=a+h
if 0.5^(a)>p then
do while 0.5^(a)>p
tmp=a:a=a+h:h=k*h '递减,+h
i=i+1
loop
else
do while 0.5^(a) <p
tmp=a:a=a-h:h=k*h '递减,+h
i=i+1
loop
end if
end if
b=tmp
do while abs(a-b)>0.0001
c=(a+b)/2
i=i+1
if (0.5^(c)-p)*(0.5^(a)-p)>0 then
a=c
else
b=c
end if
loop
c=(a+b)/2
MsgBox(c&"逼近次数:"&i)
Last edited by plp626 on 2008-5-29 at 08:26 AM ]