получить значения для полиномической функции из Excel в Java - PullRequest
1 голос
/ 05 января 2011

У меня есть график в Excel, который представляет некоторую ценность за один день.Поэтому я добавляю опорную функцию и получаю что-то вроде этого:

y = 1E-13x6 - 2E-10x5 + 8E-08x4 - 1E-05x3 + 0,0004x2 + 0,0275x + 8,414

Мера в моем наборе данных:

09:36:21 => 5,27

Первое, что мне нужно знать, это как преобразоватьвременная метка в значение для функции.После некоторого преобразования значения ячейки я обнаружил, что в Excel метки времени отображаются в диапазоне от 0,00000 до 0,99999, поэтому, например, 09:36:21 - это 0,400243055555556.Затем я написал небольшой сценарий тестирования Java:

double x = 0.400243055555556;
double x6 = (1*Math.pow(10, -13))*Math.pow(x, 6);
double x5 = (2*Math.pow(10, -10))*Math.pow(x, 5);
double x4 = (8*Math.pow(10, -8))*Math.pow(x, 4);
double x3 = (1*Math.pow(10, -5))*Math.pow(x, 3);
double x2 = (4*Math.pow(10, -4))*Math.pow(x, 2);
double y = x6 - x5 + x4 - x3 + x2 + 0.0275*x + 8.414;

Но после выполнения этого сценария я получаю y = 8.425070122712738.Так что это, очевидно, не работает.Должен сказать, что все значения на графике находятся в диапазоне от 5 до 12.

Я, очевидно, что-то делаю не так, но не знаю, что именно.Может быть, я плохо закодировал функцию, или, может быть, выбранный x не является правильным значением, но что-то не так.Может ли кто-нибудь помочь?

Обновление: мой код не был так хорош, что, как предложил Даффимо, работало лучше.Но проблема заключалась в том, что Excel указывал мне неверную тенденду.Мне удалось получить хорошую диаграмму рассеяния.

1 Ответ

1 голос
/ 05 января 2011

Я бы не рекомендовал кодировать его таким образом - округление может быть проблемой.

Я бы порекомендовал Схема Хорнера :

Я закодировал это таким образом и получил тот же ответ, что и вы:

public class Horner
{
   public static final NumberFormat DEFAULT_FORMAT = new DecimalFormat("0.000");

   public static void main(String[] args)
   {
      double [] a = { 8.414, 0.0275, 0.0004, -1.0e-5, 8.0e-8, -2.0e-10, 1.0e-13 };
      for (double x = 0.0; x < 1.0;  x += 0.05)
      {
         double y = a[0] + x*(a[1] + x*(a[2] + x*(a[3] + x*(a[4] + x*(a[5])))));
         System.out.println("x = " + DEFAULT_FORMAT.format(x) + " y = " + DEFAULT_FORMAT.format(y));
      }
   }
}

Вот результат, который я получаю. Условия высшего порядка не приносят много пользы; коэффициенты малы, и когда вы увеличиваете дробь до степени, это еще больше уменьшает эффект.

x = 0.000 y = 8.414
x = 0.050 y = 8.415
x = 0.100 y = 8.417
x = 0.150 y = 8.418
x = 0.200 y = 8.420
x = 0.250 y = 8.421
x = 0.300 y = 8.422
x = 0.350 y = 8.424
x = 0.400 y = 8.425
x = 0.450 y = 8.426
x = 0.500 y = 8.428
x = 0.550 y = 8.429
x = 0.600 y = 8.431
x = 0.650 y = 8.432
x = 0.700 y = 8.433
x = 0.750 y = 8.435
x = 0.800 y = 8.436
x = 0.850 y = 8.438
x = 0.900 y = 8.439
x = 0.950 y = 8.440

Все еще не то, что вы хотите, но я думаю, что кодирование намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...