簡體   English   中英

用Linq計算余弦和正弦

[英]Compute cosine and sine with Linq

我編寫了一些代碼來計算正弦和余弦,但是,該代碼並不是很好,我想知道是否可以使該代碼使用Linq計算值。

那是我計算正弦的代碼

        var primes = PrimeNumbers(3, 15);

        bool SumSub = false;
        decimal seno = (decimal)(nGrau * nSeno);
        foreach (var a in primes)
        {
            if (SumSub == false)
            {
                seno -= (decimal)Math.Pow(nGrau, (double)a) / Factorial(a);
                SumSub = true;
            }
            else
            {
                seno += (decimal)Math.Pow(nGrau, (double)a) / Factorial(a);
                SumSub = false;
            }
        }
        Console.WriteLine(seno);

是否可以使用linq編寫代碼來計算degres的正弦值?

您可以使用Aggregate

decimal seno = PrimeNumbers(3, 15)
    .Aggregate(
        new { sub = false, sum = (decimal)(nGrau * nSeno) },
        (x, p) => new {
            sub = !x.sub,
            sum = x.sum + (x.sub ? 1 : -1) * (decimal)Math.Pow(nGrau, (double)p) / Factorial(p)
        },
        x => x.sum);

我沒有測試過,但認為應該可以。

順便說一句。 我認為這比您的解決方案更具可讀性或更好。 如果我是你,我會使用foreach循環,但要對其進行一些改進:

foreach (var a in primes)
{
    seno += (SumSub ? 1 : -1) * (decimal)Math.Pow(nGrau, (double)a) / Factorial(a);
    SumSub = !SumSub;
}

大概是這樣的:

var sineResult = listDouble.Select((item, index) => 
                                    new {i = (index%2)*2 - 1, o = item})
                           .Aggregate(seno, (result, b) => 
                                      result - b.i * ((decimal)Math.Pow(nGrau, (double)b.o) / Factorial(b.o)));

編碼

i = (index%2)*2 - 1

給您交替的1和-1。

Aggregate語句對值求和,將每個值乘以-1或1。

這是一個函數,計算余弦的泰勒級數逼近的前10個項的和:

var theta = 1.0m;   // angle in radians
Enumerable.Range(1, 10).Aggregate(
    new { term = 1.0m, accum = 0.0m },
    (state, n) => new {
             term  = -state.term * theta * theta / (2 * n - 1) / (2 * n),
             accum = state.accum + state.term},
    state => state.accum)

看看它如何不使用ifPowerFactorial 只需將最后一項乘以-1即可創建交替符號。 在每個術語上計算越來越大的指數和階乘不僅昂貴而且會導致精度損失,這也是不必要的。

要獲得x^2x^4x^6 …,您要做的就是將每個連續項乘以x^2 得到1/1! 1/3! ,1/ 1/5! ,...您要做的就是將每個連續項除以序列中的下兩個數字。 1開始; 得到1/3! ,除以2再乘以3; 得到1/5! 除以4再乘以5,依此類推。

請注意,我使用m前綴表示decimal值,因為我假設您出於某種原因試圖使用decimal進行計算(否則,您將使用Math.Cos )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM