Оценка формулы с показателями - PullRequest
2 голосов
/ 08 июня 2011

Я пытаюсь скопировать следующую формулу из Excel в приложение C #, и результат будет другим.

Ответ, где x=5 должен быть y=55.249875, который я только что сделал с помощью калькулятора Windows и соответствует ответу Excel ... но не тогда, когда я пробую его в C #.

Для E я использую Math.Exp и для x^y Я использую Math.Pow().

Есть идеи?

Формула:

y = -1E-06x^6 + 0.0001x^5 - 0.0025x^4 + 0.0179x^3 + 0.0924x^2 - 0.6204x + 55.07

Ответы [ 5 ]

9 голосов
/ 08 июня 2011

Это будет:

static double Compute(double x)
{
    return -1E-06 * Math.Pow(x, 6) 
        + 0.0001 * Math.Pow(x, 5) 
        - 0.0025 * Math.Pow(x, 4) 
        + 0.0179 * Math.Pow(x, 3) 
        + 0.0924 * Math.Pow(x, 2)
        - 0.6204 * x + 55.07;
}

Вот полностью рабочая тестовая программа для демонстрации:

using System;
class Test
{
    static double Compute(double x)
    {
        return -1E-06 * Math.Pow(x, 6) 
            + 0.0001 * Math.Pow(x, 5) 
            - 0.0025 * Math.Pow(x, 4) 
            + 0.0179 * Math.Pow(x, 3) 
            + 0.0924 * Math.Pow(x, 2)
            - 0.6204 * x + 55.07;
    }

    static void Main()
    {
        Console.WriteLine("Value for x {0} == {1}", 5, Compute(5));
        Console.ReadKey();
    }
}

Я думаю, что путаница заключалась в том, что вы предполагали, что -1E-06 требует Math.Exp, но это не так. Это просто число в Scientific Notation.

8 голосов
/ 08 июня 2011

E - научная запись, поэтому основание 10. Math.Exp - естественное возведение в степень, т. Е. e^x.

Вместо записи -Math.Exp(-06)*Math.Pos(x, 6) вы просто пишете -1E-06*Math.Pow(x, 6).

1 голос
/ 08 июня 2011

Попробуйте это:

Func<double, double> calc = x => -1E-06d*Math.Pow(x, 6)
                                    + 0.0001d*Math.Pow(x, 5)
                                    - 0.0025d*Math.Pow(x, 4)
                                    + 0.0179d*Math.Pow(x, 3)
                                    + 0.0924d*Math.Pow(x, 2)
                                    - 0.6204d*x
                                    + 55.07;
var y = calc(5);
Console.Out.WriteLine("y = {0}", y);
1 голос
/ 08 июня 2011

Для E я использую Math.Exp

Есть ваша проблема.-1E-06 - числовой литерал -1 * 10 ^ -6 (т.е. -0,000001), это не -1 * e ^ -6.

0 голосов
/ 08 июня 2011

В Excel и C # я получаю 61,4538750 для X = 5.

Вот код C #:

class Program
    {
        static void Main(string[] args)
        {
            // -1E-06x^6 + 0.0001x^5 - 0.0025x^4 + 0.0179x^3 + 0.0924x^2 - 0.6204x + 55.07
            var done = false;
            while(!done)
            {
                double x;
                if (!Prompt("X> ", out x, out done))
                {
                    if (done) break;
                }
                var sum = Calculate(x);
                Console.WriteLine("Result = {0}", sum);
            }



#if DEBUG
            Console.WriteLine("Press enter to exit.");
            Console.ReadLine();
#endif
        }

        private static double Calculate(double x)
        {
            Console.WriteLine("Calculating -1E-06x^6 + 0.0001x^5 - 0.0025x^4 + 0.0179x^3 + 0.0924x^2 - 0.6204x + 55.07");
            var coefficients = new double[] { -1e-6, +1e-4,-2.5e-3,+1.79e-2,9.24e-2,6.204e-1, 5.507e1 };
            var powers = new double[] { 6,5,4,3,2,1,0 };

            var sum = 0.0;
            for(var i=0;i<coefficients.Length;i++)
            {
                var termValue = coefficients[i] * Math.Pow(x, powers[i]);
                sum += termValue;
                Console.WriteLine("Sum [{0}x^{1}] = {2}", coefficients[i],powers[i],termValue);
            }

            return sum;

            //var result = -1E-6*Math.Pow(x,6) + 1E-4*Math.Pow(x,5) - 2.5E-4*Math.Pow(x,4) + 1.79E-2*Math.Pow(x,3)
        }

        static bool Prompt(string prompt, out double value, out bool done)
        {
            done=false;
            var validInput = false;

            Console.Write("X> ");
            var xString = string.Empty;
            if(!(validInput = double.TryParse(xString = Console.ReadLine(),out value)))
            {
                done = xString.ToLower()=="quit";
            }

            return validInput;

        }
...