中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-15 15:53
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【原创】逼近算法研究 查看 932 回复 12
楼 主 【原创】逼近算法研究 发表于 2008-05-13 16:10 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
以线性函数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 ]
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2 发表于 2008-05-13 18:24 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
问题1:可以加if语句……
不过每次都判断……
还不如复制2边……第一边用2,后面用1
直接有常量还不用k……

问题2:看 msgbox 的参数说明
3 发表于 2008-05-13 20:37 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
设f(x)在指定区间比如单调增,求f(x)=定值比如pi的根,
'非对称三分逼近
dim a,b,h,i
a=0
b=3141592.6535893
h=1
k=2
do while abs(f(a)-b)>0.0000001
do while f(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 f(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)


[ Last edited by plp626 on 2008-5-14 at 06:35 PM ]
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
4 发表于 2008-05-13 21:59 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
f(x)?

数组还是函数?
5 发表于 2008-05-13 22:12 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
是函数
你可以拿log(x)试试

再问句:
VBS怎么在一行给多个变量赋值
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
6 发表于 2008-05-13 22:21 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
我直接给代码吧:或许你可以帮我精简
'非对称三分逼近
dim a,b,h,i
a=0.1
b=3.14159265
h=1
k=2
do while abs(log(a)-b)>0.0000001
do while log(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 log(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("ln(x)=pi的根为:"&a&" 逼近次数:"&i)

请问:
MsgBox(prompt)


帮助上对我这个代码msgbox显示标题好像无能为力。。。。

[ Last edited by plp626 on 2008-5-14 at 06:04 PM ]
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
7 发表于 2008-05-14 00:36 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
MsgBox "ln(x)=pi的根为:" & a & " 逼近次数:" & i,,b

无能为力?
8 发表于 2008-05-14 00:40 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
还是不清楚算的是啥……结果和Pi什么关系?
9 发表于 2008-05-14 11:20 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
Originally posted by slore at 2008-5-14 12:40 AM:
还是不清楚算的是啥……结果和Pi什么关系?


log(23.14069144)=Pi
我只是举个例子,我拿这个算法,算积分方程呢,虽然没有某些特定算法高效,但通用性特别高。。。。
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
10 发表于 2008-05-14 11:39 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
Originally posted by slore at 2008-5-14 12:36 AM:
MsgBox "ln(x)=pi的根为:" & a & " 逼近次数:"

好,这个问题搞定,谢谢

VBS怎么在一行给多个变量赋值?
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
11 发表于 2008-05-14 11:51 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
Const e = 2.71828182845904523536
Const Pi = 3.14159265
MsgBox Log(23.14069144)
MsgBox e^Pi
12 发表于 2008-05-14 11:52 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
UID 79003
性别 男
状态 离线
:等于换行……

a=1:b=2
13 发表于 2008-05-14 11:53 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
UID 103127
性别 男
状态 离线
Originally posted by slore at 2008-5-14 11:52 AM:
:等于换行……

a=1:b=2

哦,我怎么忘了,你在那个帖子-----汉字转拼音 里说过,

山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
论坛跳转: