
Dim a, b
Private Sub Command1_Click()
temp = (Val(a) + Val(b)) / 2
If h(temp) = Abs(h(temp)) And h(a) < 0 Then b = temp
If h(temp) = Abs(h(temp)) And h(b) < 0 Then a = temp
If h(temp) <> Abs(h(temp)) And h(a) > 0 Then b = temp
If h(temp) <> Abs(h(temp)) And h(b) > 0 Then a = temp
Print a
Print b
End Sub
Function h(x)
h = Val(x) ^ 6 - 5 Val(x) ^ 5 + 3 Val(x) ^ 4 + Val(x) ^ 3 - 7 Val(x) ^ 2 + 7 Val(x) - 20
End Function
Private Sub Form_Load()
a = -2
b = 5
End Sub
点一次就再精确一次
那就累加到高阶项的值小于1e-6啊,vb可以支持这个精度的。
---------------------------------------------------------
迭代的思想不是这样的吧,如果可以直接求1/3次,那还迭代什么。
它主要思想是用简单运算如加减乘除来代替复杂运算如开方。
通常用牛顿展开式,因展开式有无穷项但有些式子高阶项逐渐趋近于零,
所以高阶项<误差时,结果小于误差。
因此要判断高阶项,不是直接判断结果。
但有时收敛会很慢,那要多迭代几次。
求PI的公式很多,这里选择比较简单的一个迭代公式
PI = 4(1 - 1/3 + 1/5 -1/7+(-1)^(m-1)/(2m-1)
'迭代法求PI值,Count 是迭代次数,在10000以上可以准确到小数后3位
Function GetPI(Count As Long) As Double
Dim i As Long
For i = 1 To Count
GetPI = GetPI + (-1) ^ (i - 1) / (2 i - 1)
Next
GetPI = 4 GetPI
End Function
#include <stdioh>
#include <mathh>
float value()
{
float x0, x1;
x0 = 0;
x1 = cos(x0);
while (abs(x0 - x1) >= 0000001)
{
x0 = x1;
x1 = cos(x0);
}
return x1;
}
void main()
{
printf("迭代方法求方程:cos(x)-x=0的解为%f\n", value());
}
Private Sub Command1_Click()
a = Val(InputBox("a="))
x = 0: y = a
Do While Abs(y - x) >= 000001
x = y
y = (x + a / x) / 2
Loop
Print y
End Sub
给你一个容易理解但是很麻烦的办法吧,先估算出未知数t和k的范围,比如t∈(-100,500),k∈(-300,1000),再设两个步长,dt=0001,k=0003。再设一个阈值d=001,然后循环
for t=-100 to 500 step 0001
for k=-300 to 1000 step 0003
if a1t^3++h1 < 001
//在阈值范围内,输出t和k值
next k
next t
这个方法在步长和阈值设置合理的情况下可以求得近似解。
如果要优化,可以参考优化设计方面的书籍,像什么分支定界法之类的提高计算效率。
Dim a1, b1, c1, d1, e1, f1, g1, h1, a2, b2, c2, d2, e2, f2, g2, h2 As Double
'要给这些常数赋值
Dim t, k As Double
For t = 0 To 1 Step 0001
For k = 0 To 1 Step 0001
If Abs(a1t ^ 3 + b1 t ^ 2 + c1 t + d1 t k ^ 2 + e1 t k + f1 k ^ 2 + g1 k + h1) < 0001 And Abs(a2 k ^ 3 + b2 k ^ 2 + c2 k + d2 k t ^ 2 + e2 k t + f2 t ^ 2 + g2 t + h2) < 0001 Then
'在阈值范围内,输出t和k值
Print "t="; t
Print "k="; k
End If
Next k
Next t
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)