回 帖 发 新 帖 刷新版面

主题:求助,辛卜生积分

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个回复)

沙发

你查一下数学函数,你的LOG函数对吗?

板凳


LOG函数没问题,我是参考《科学与工程数值算法》着一本书的,LOG(x)就是数学式中的Lnx

3 楼

[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 楼

[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 楼

不仅是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 楼

不知你看到5楼的答复没有,看见了回个话,不管正确与否,大家都会有收益

7 楼


解决方法:


 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 楼


另外,此积分计算完后,我怎么获得迭代次数呢?

9 楼

解决得不错,这就保证了表达式大于 0


再循环里加一个变量,每循环一次(即迭代一次)加1

我来回复

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