回 帖 发 新 帖 刷新版面

主题:步长如此小如何改

奇怪,给定初始点和参数,进行满足一不等式的线性搜索,得到一个迭代点,为何步长竟然小到10的负159次方,不知程序错在何处?到底是程序错了还是只需调整参数?请高手能传授,不胜感激!

回复列表 (共10个回复)

沙发

有何不妥? 10 ** (-159) 没有什么特别呀,在双精度表示下不会下溢; 其实,最重要的是您所说问题的单位是什么,若特征单位是 10 ** (-158),则根本无所谓您说的问题,若是您的特征单位是 1,步数要 10 ** (159),则真的是有些问题了,求解的时间复杂度相当大。

板凳

当找不到问题的症结时非常郁闷,感到很无助,但在论坛中一提问就得到素不相识的高手老师的热情指点,感动万分!

3 楼


给定初始点x,搜索方向d,要求出下一个迭代点,那我需要计算步长,这个步长要满足一个不等式,我采用双精度计算,我依次采用0.1的 k = 1次方, k = 2次方,k = 3次方,。。。试探,直到满足那个规定的不等式,才得到步长。
在求步长的过程中我需要不断计算[f(x+0.1^k*d)-f(x)]/[0.1^k],其中 f 是连续函数,我担心的是 k 很大,分母很小,分子也很小,这样会造成数值不稳定吧

4 楼

当然,分子属于两个相近的数想减,有效数字损失。

5 楼

感谢您的回复,但我的程序中必须算[f(x+steplength*d)-f(x)]/steplength,老师有啥建议没

6 楼

本质还是导数的差商近似,用 Taylor 展开推导局部截断阶数较高的公式,可以改善;看看数值分析的数吧,对你有好处。但关于差商,数值界目前的结论是:不稳定。

7 楼

感谢您的回复

8 楼

编程中遇到一现象:
real(8),parameter :: eps = 1.0d-4
write(1,fmt=1030) "eps = ",eps
1030 format(/A10,f12.4)
奇怪为何要求按上面格式输出eps时,显示 
run time error  
sqrt:domain error
没有write语句则能给出一运行结果,why?

9 楼

请高手们能帮助我

10 楼

现在我才明白,当时出现步长特别小是因为我在编程中把一个量的符号弄错了,当把这个符号弄错时整个算法的理论就错了,难怪算不出。

我来回复

您尚未登录,请登录后再回复。点此登录或注册