VB.net中余弦定律的优化

时间:2013-05-26 19:51:20

标签: vb.net math optimization cosine

我在程序中使用余弦定律,这似乎是我的代码的一个慢点。这是我的代码行:

Ans = Math.Sqrt(A ^ 2 + B ^ 2 - 2 * A * B * Math.Cos(C - D))

其中A到D是每次调用时都会改变的双变量。此功能似乎需要大约2000个滴答才能运行。我已经看过使用小角度近似,即if(C-D)足够小,你可以使用cos(C-D)= 1 - ((C-D)^ 2)/ 2。不幸的是,总体来说这比原始代码要慢。我看过任何可用于简化计算的关系,但A和C以复杂的方式相关,B和D以相同的方式相关,A和B之间或C和D之间没有关系

我已经考虑过对(CD)的所有值使用查找函数,但我的准确度目前至少有6位有效数字,我宁愿保持在那个级别,因为这是我输入数据的准确性,简而言之,这意味着在查找中大约有一百万个vaules,这只是该功能的一部分。我想过要查看所有四个值(A,B,C和D),但我不确定如何实现它。

我已经多线程化了这个应用程序并试图使用GPGPU(由于加载进出GPU内存所花费的时间,GPGPU最终变慢了。)

所以,我的问题是如何加快这个功能。

先谢谢!

1 个答案:

答案 0 :(得分:3)

以下时间不到1/3

ans = Math.Sqrt(a * a + b * b - 2 * a * b * Math.Cos(c - d))

这是证明它的代码:

    Dim sw1 As New Stopwatch
    Dim sw2 As New Stopwatch

    Dim ans, a, b, c, d As Double
    a = 5
    b = 10
    c = 4
    d = 2

    sw1.Start()
    For x As Integer = 1 To 10000
        ans = Math.Sqrt(a ^ 2 + b ^ 2 - 2 * a * b * Math.Cos(c - d))
    Next
    sw1.Stop()

    sw2.Start()
    For y As Integer = 1 To 10000
        ans = Math.Sqrt(a * a + b * b - 2 * a * b * Math.Cos(c - d))
    Next
    sw2.Stop()

    Console.WriteLine(sw1.ElapsedTicks)
    Console.WriteLine(sw2.ElapsedTicks)

    Console.WriteLine(sw2.ElapsedTicks * 100 / sw1.ElapsedTicks)