【发布时间】:2018-06-13 17:03:58
【问题描述】:
我知道这是一篇很长的文章,但我非常感谢您的帮助。 我正在尝试将Newton Raphson method 编码为 VBA,代码如下所示:
代码:
'Code illustrating Newton-Raphson scheme for the equation:
' f(x) = arcCos((x-BCos(H))/S)-arcSin((Bsin(H)-y)/S)
Const ep = 1E-23: Const imax = 100
Private x As Long: Private xnew As Single: Private xl As Single
Private xu As Single: Private xm As Single: Private xmold As Single: Private A As Single: Private B As Single
Private C As Single: Private D As Single
Private i As Integer
Private Failed As Boolean: Private Converged As Boolean
Sub Setup()
Failed = False
Converged = False
i = 0
End Sub
Sub NRRoot()
Set sht = Sheets("Sheet1")
For rw = 2 To 3601
x = sht.Cells(rw, 48)
Setup
Do
Dim fx As Single: Dim fprimex As Single
fx = Application.Acos((Range("O9") - Range("AI5") * Cos(x)) / Range("AL5")) - Application.Asin((Range("AI5") * Sin(x) - Range("P9")) / Range("AL5"))
fprimex = -(Range("AI5") * Sin(x) * Range("AL5")) / (Range("AL5") * Sqr((Range("AL5") ^ 2) - (Range("O9") ^ 2) + 2 * Range("O9") * Range("AI5") * Cos(x) - (Range("AI5") ^ 2) * (Cos(x) ^ 2))) - (Range("AI5") * Cos(x) * Range("AL5")) / (Range("AL5") * Sqr((Range("AL5") ^ 2) - (Range("AI5") ^ 2) * (Sin(x) ^ 2) + 2 * Range("P9") * Range("AI5") * Sin(x) - (Range("P9") ^ 2)))
xnew = x - fx / fprimex
Dim er As Single
er = Abs(2 * (xnew - x) / (xnew + x))
If er < ep Then
Converged = True
ElseIf i >= imax Then
Failed = True
Else
i = i + 1
x = xnew
End If
Loop Until Converged Or Failed
If Failed Then
sht.Cells(rw, 50).Value = "Iteration failed"
Else
sht.Cells(rw, 50).Value = xnew
End If
sht.Cells(rw, 51).Value = i
Next
End Sub
问题:
我收到错误消息:“运行时错误'13':类型不匹配”,并使用调试器显示在这行代码中:
fx = Application.Acos((Range("O9") - Range("AI5") * Cos(x)) / Range("AL5")) - Application.Asin((Range("AI5") * Sin(x) - Range("P9")) / Range("AL5"))
我认为这与Application.Acos 和Application.Asin 有关,但我不太确定。我遇到了一段时间的麻烦,我做了一些搜索,发现This 表明我必须输入Application.Acos 或Application.WorksheetFunction。输入的值都是从 -pi 到 pi 的弧度。
如果不是因为上面的文字,那么我认为它可能与我正在定义的参数有关...就在顶部它说Private x As Long也许它必须是别的东西。我尝试了故障排除,但它从未真正奏效:(
分别列出单元格O9、P9、AI5和AL5中的值:2000、3000、5700、2924.99
附: 我需要使用这种方法的原因是因为我试图在给定某个点 x,y (O9,P9) 时计算 2 根棍子的角度。我需要这些角度才能计算出两根棍子的质心。一旦我有了质心,我就可以完成我正在做的项目的计算。我知道还有其他(更好的)方法可以解决这个问题,比如 wolfram mathematica,但是项目的其他部分需要在 excel 上。因此,遗憾的是,为了让一切尽可能顺利,我需要在 Excel 上完成所有这些工作。
附言 顺便说一句,这不是我的代码,我是从Here 复制的,但我认为它确实解决了 Newton Raphson 方法。
解决方案
我有 arcSin 的数字,从 pi 开始到 -pi 而不是 90 到 -90...
如果我能找到更好的方法来编写牛顿拉夫森方法,我一定会写一篇关于它的新文章。
【问题讨论】:
-
您可能在其中一个单元格中有文本。顺便说一句,为什么
x的类型是Long而不是浮点数? -
@NicoSchertler 它最初是
single类型,但我正在排除故障,我想我从来没有把它改回来。我会尝试制作另一种类型的 x。float等价于什么?你知道吗? -
我仔细检查了,其中一个单元格中没有文本。 @NicoSchertler
-
然后先尝试将值存储在一些变量中,看看是否有转换错误。例如。
Dim B As Single : B = Range(...)。无论如何,这将使您的代码更干净。 -
已经解决了
标签: vba excel math nonlinear-functions newtons-method