急求,用牛顿迭代法求方程,用VB解

急求,用牛顿迭代法求方程,用VB解,第1张

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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/13495462.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存