主题:求助,辛卜生积分
wendan [专家分:0] 发布于 2008-09-09 16:11:00
Function nisimpson(a As Double, b As Double, eps As Double) As Double
Dim n As Long, k As Long
Dim h As Double, t1 As Double, t2 As Double, s1 As Double, s2 As Double
Dim ep As Double, p As Double, x As Double
n = 1
h = b - a
t1 = h * (func(a) + func(b)) / 2
s1 = t1
ep = eps + 1
While (ep >= eps)
p = 0
For k = 0 To n - 1
x = a + (k + 0.5) * h
p = p + func(x)
Next k
t2 = (t1 + h * p) / 2
s2 = (4 * t2 - t1) / 3
ep = Abs(s2 - s1)
t1 = t2
s1 = s2
n = n + n
h = h / 2
Wend
nisimpson = s2
End Function
Sub form_load()
Dim a As Double, b As Double, eps As Double, v As Double
Dim PI As Double
PI = 3.1415926
a = 0
b = PI / 2
eps = 0.00001
v = nisimpson(a, b, eps)
MsgBox "积分值=" & v
End Sub
Function func(x As Double) As Double
Dim i As Integer, j As Integer, q As Integer
Dim u As Double, d As Double
Dim PI As Double
PI = 3.1415926
i = 1
j = 3
u = 0.2
q = 5
d = 1.4
[color=FF0000]func = 4 * (1 - u) * Log((i - j - 0.5) * q + (d * d * (Cos(x)) ^ 2 + (i - j - 0.5) ^ 2 * q * q) ^ 0.5)[/color](当定义这个函数时,若i比j大,运行正常,但是当i比j小时,就抱错)
End Function
请高手指点,多谢!
回复列表 (共9个回复)
沙发
lcrxl1815 [专家分:110] 发布于 2008-09-09 18:47:00
你查一下数学函数,你的LOG函数对吗?
板凳
wendan [专家分:0] 发布于 2008-09-10 09:31:00
LOG函数没问题,我是参考《科学与工程数值算法》着一本书的,LOG(x)就是数学式中的Lnx
3 楼
wdkshp [专家分:5490] 发布于 2008-09-10 11:15:00
[quote]
func = 4 * (1 - u) * Log((i - j - 0.5) * q + (d * d * (Cos(x)) ^ 2 + (i - j - 0.5) ^ 2 * q * q) ^ 0.5)[/quote]
当i比j小时,(i-j-0.5)小于0 ,负数和0是没有对数的
4 楼
wendan [专家分:0] 发布于 2008-09-11 09:30:00
[quote][quote]
func = 4 * (1 - u) * Log((i - j - 0.5) * q + (d * d * (Cos(x)) ^ 2 + (i - j - 0.5) ^ 2 * q * q) ^ 0.5)[/quote]
当i比j小时,(i-j-0.5)小于0 ,负数和0是没有对数的[/quote]
LOG 所对应的函数是:
( (i - j - 0.5) * q + (d * d * (Cos(x)) ^ 2 + (i - j - 0.5) ^ 2 * q * q) ^ 0.5 [color=FF0000])[/color]
并非(i - j - 0.5) * q
整个函数式我用括号括起来了!!!
5 楼
wdkshp [专家分:5490] 发布于 2008-09-12 13:59:00
不仅是i<j时出错,应该是(i-j)<=0.5时都会出错,因为:
当(i-j)<=0.5且([color=FF0000][size=6]x很近似于k*pi+pi/2[/size][/color])[color=000000][size=2]时(k为整数),
Cos(x) = 0
d * d * (Cos(x)) ^ 2 = 0
(i - j - 0.5) * q < 0
那么
(d * d * (Cos(x)) ^ 2 + (i - j - 0.5) ^ 2 * q * q) ^ 0.5=[/size][/color]
[color=FF0000][size=6]-(i - j - 0.5) * q [/size][/color]
[size=2]也就是说
(i - j - 0.5) * q + (d * d * (Cos(x)) ^ 2 + (i - j - 0.5) ^ 2 * q * q) ^ 0.5的值为[size=6][color=FF0000]0[/color][/size],[color=000000][size=2]此时log()函数就抱错[/size][/color][/size]
再看你的代码执行过程:
当form载入时,b=pi/2
然后调用nisimpson()函数,而该函数第一次调用func函数时
b的值未变,此时
[size=6][color=FF0000]cos(b)=0[/color][/size][color=000000][size=2],接下来错误问题就出现了
6 楼
wdkshp [专家分:5490] 发布于 2008-09-17 12:53:00
不知你看到5楼的答复没有,看见了回个话,不管正确与否,大家都会有收益
7 楼
wendan [专家分:0] 发布于 2008-09-17 15:38:00
解决方法:
4 * (1 - u) * Log([color=FF00FF]0.9999999999 [/color]* (i - j + 0.5) * q + (d * d * (Cos(x)) ^ 2 + (i - j + 0.5) ^ 2 * q * q) ^ 0.5)
用一个无限接近1的数字代替1
8 楼
wendan [专家分:0] 发布于 2008-09-17 15:49:00
另外,此积分计算完后,我怎么获得迭代次数呢?
9 楼
wdkshp [专家分:5490] 发布于 2008-09-17 15:53:00
解决得不错,这就保证了表达式大于 0
再循环里加一个变量,每循环一次(即迭代一次)加1
我来回复