繁体   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