很复杂的计算公式如何实现
a=(k0+k1*p)/(p*p) ,b=p*e的幂(a+a*a) ,其中k0、k1、b为已知数。 麻烦问下用迭代法求出p的代码如何实现啊?
程序代码:Private Sub Command1_Click()
'牛顿迭代法是个高效的算法,他利用函数点的切线(函数倒数)不断逼近实际值
'求平方根的公式为x=(x+a/x)/2,其中a即为要求平方根的数
'同样求2的平方根,牛顿迭代法只需循环5次,而二分迭代法却要47次,可见牛顿迭代的效率
Dim c As Long, a As Double, x As Double
If Val(Text1) = 0 Then Exit Sub
d = 0.00000000000001 '设置精度
a = Val(Text1) '取出要开平方的数
x = a '初始值设置
c = 0
Do
c = c + 1
x = (x + a / x) / 2
Loop Until Abs(a - x ^ 2) < d or c>100 '直到误差小于规定的误差即停止循环
Text2 = x '输出结果
Label3.Caption = "牛顿迭代法所用次数为" & c
End Sub
Private Sub Command2_Click()
'二分迭代法求平方根,所谓二分就是区间距离的平分
'比如求2的平方根,第一次赋值j为2,j1为0,j-j1=2,平分后为1,因此j调整为2-1=1
'第二次因为区间变成了1到2之间,所以平分即为(2-1)/2=0.5,由于1的平方小于2,因此至此j=1+0.5=1.5
'第三次区间变成了1到1.5之间,平分值为(1.5-1)/2=0.25,由于上次计算的1.5平方大于2,因此这次调整为1.5-0.25=1.25
'第四次区间变成了1.25到1.5之间,平分值为0.125,上次1.25的平方小于2,这次j调整为1.25+0.125=1.375
'第五次区间为1.375到1.25,平分为0.0625,由于1.375平凡小于2,就调整为1.375+0.0625=1.4375
'第六次区间为1.4375到1.375,平分为0.03125,上次1.4375平方大于2,就调整为1.4375-0.03125=1.40625
'如此不断调整区间的平分数,并根据上次误差是大于0还是小于0来加减平分数,逐渐逼近实际数值
Dim c As Long, i As Double, j As Double, j1 As Double, d As Double, k As Double, f As Integer
If Val(Text1) = 0 Then Exit Sub
d = 0.00000000000001 '设置精度
i = Val(Text1) '取出要开平方的数
j = i
j1 = 0 'j和j1是第一次二分的区间
f = -1 '第一次给的数肯定是大于目标数的,必定是减去二分数
c = 0 '计数器清零
Do
c = c + 1 '记录迭代次数
k = Abs(j - j1) / 2 '变量j和j1是确定二分的区间,以此计算二分调整值
j1 = j
j = j + k * f
f = 1 '默认为下次调整为加上二分值
If i - j ^ 2 < 0 Then f = -1 '如果j的平方大于实际值则下次调整为减去二分值
Loop Until Abs(i - j ^ 2) < d Or k < d '直到误差或二分调整值小于规定的误差即停止循环
Text2 = j '输出结果
Label3.Caption = "二分法迭代次数为" & c
End Sub