中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 【原创】逼近算法研究 上一主题 | 下一主题
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『楼 主』:  【原创】逼近算法研究

以线性函数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)


  Quote:


  Quote:
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学习
2008-5-13 16:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

问题1:可以加if语句……
不过每次都判断……
还不如复制2边……第一边用2,后面用1
直接有常量还不用k……

问题2:看 msgbox 的参数说明

2008-5-13 18:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 3 楼』:  

设f(x)在指定区间比如[0,inf]单调增,求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学习
2008-5-13 20:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 4 楼』:  

f(x)?

数组还是函数?

2008-5-13 21:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 5 楼』:  

是函数
你可以拿log(x)试试

再问句:
VBS怎么在一行给多个变量赋值



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

进入网盘(各种工具)~~ 空间~~cmd学习
2008-5-13 22:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 6 楼』:  

我直接给代码吧:或许你可以帮我精简

'非对称三分逼近
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)

请问:

  Quote:
MsgBox(prompt[, buttons][, title][, helpfile, context])

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

[ Last edited by plp626 on 2008-5-14 at 06:04 PM ]



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

进入网盘(各种工具)~~ 空间~~cmd学习
2008-5-13 22:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 7 楼』:  

MsgBox "ln(x)=pi的根为:" & a & " 逼近次数:" & i,,b

无能为力?

2008-5-14 00:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 8 楼』:  

还是不清楚算的是啥……结果和Pi什么关系?

2008-5-14 00:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by slore at 2008-5-14 12:40 AM:
还是不清楚算的是啥……结果和Pi什么关系?

log(23.14069144)=Pi
我只是举个例子,我拿这个算法,算积分方程呢,虽然没有某些特定算法高效,但通用性特别高。。。。



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

进入网盘(各种工具)~~ 空间~~cmd学习
2008-5-14 11:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by slore at 2008-5-14 12:36 AM:
MsgBox "ln(x)=pi的根为:" & a & " 逼近次数:"[c ...

好,这个问题搞定,谢谢

VBS怎么在一行给多个变量赋值?



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

进入网盘(各种工具)~~ 空间~~cmd学习
2008-5-14 11:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 11 楼』:  

Const e = 2.71828182845904523536
Const Pi = 3.14159265
MsgBox Log(23.14069144)
MsgBox e^Pi

2008-5-14 11:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 12 楼』:  

:等于换行……

a=1:b=2

2008-5-14 11:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by slore at 2008-5-14 11:52 AM:
:等于换行……

a=1:b=2

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





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

进入网盘(各种工具)~~ 空间~~cmd学习
2008-5-14 11:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: