2015-07-09 8 views
0

У меня есть тренд графика, уравнение которого мне неизвестно, его график в плоскости xy, где x обозначает время, которое равно 1 96 (представляющий период 15 минут), а y обозначает значение при заданном x. Мне присваивается значение y при заданном x say (4, 30). Теперь мне нужно проследить кривую и найти значения y для всех остальных x.Учитывая значение в точке на кривой, как приблизить значения в других точках на кривой

Любая идея, как это можно сделать с помощью исчисления и как я могу его запрограммировать?

Я пытаюсь сделать это с использованием касательных линий, но я не могу полностью продумать это.

Пример: предположим, что я построю график с использованием значений x, y, это будет асимметричная кривая. Теперь, как только кривая будет нарисована. Та же кривая может использоваться для аппроксимации значений в разных наборах данных, которые показывают тот же тренд кривой. Поэтому, если мне дают только одну точку, скажите y = 40 при x = 10, как мне получить значения Y для другого x для набора данных, показывающего аналогичную тенденцию кривой.

1,6.81 
2,5.516 
3,6.088 
4,8.025 
5,6.89 
6,9.98 
7,8.511 
8,8.458 
9,8.172 
10,8.467 
11,10.294 
12,11.106 
13,10.517 
14,7.905 
15,8.141 
16,9.608 
17,8.774 
+1

Я бы спросил у math.stackexchange.com во-первых – malarres

+0

Я не думаю, что вы можете найти функцию, когда знаете только одну точку ... – Hassan

+0

какая кривая? в какой форме? (изображение (растр/вектор?), множество точек, ...) добавьте пример того, какие данные у вас есть – Spektre

ответ

0

В основном у вас есть две задачи:

  1. Учитывая множество точек, которые вы ищете модель.
    1. Структура модели.
    2. Параметры модели.
  2. Используя предыдущую модель, настройте ее параметры так, чтобы она соответствовала новым точкам.

Таким образом, один шаг за один раз ...

1. Структура и параметры при

Это трудно. У вас есть в основном два варианта.

  1. Вы можете выбрать структуру вручную, например. линейная модель (т. е. уравнение вида y = a*x + b) или полиномиальная модель (т. е. уравнение формы y = c_n * x^n + c_n-1 * x^n - 1 + ... + c_0, но вы также должны выбрать n). Или нейронную сеть (где вам нужно исправить топологию).

    Если вы это сделаете, то установка параметров будет легкой (если у вас есть разумная модель, подобная той, о которой я упоминал). Специально для линейных и полиномиальных моделей смотрите here и here.

  2. Позвольте некоторому алгоритму найти структуру. Если вы хотите остаться в раме нейронной сети, вы можете использовать NEAT или HyperNEAT. Или, если вам действительно нужно символическое описание, вы можете использовать Genetic Programming и аналогичные алгоритмы. Или, если вам нужен полином, но вы не знаете степени, вы можете просто попробовать несколько из них.

2. Pameter настройка на новые данные

Ну, для этой работы вам нужна модель, которая позволяет настраивать параметр, а затем вам нужно достаточно данных, модель должна быть настроена. Для линейной модели это не менее 2 баллов.Для многочлена число равно степени + 1 (или количеству коэффициентов).

Если вы использовали что-то вроде генетического программирования, вам, вероятно, не повезло, потому что это просто приспособленное символическое выражение, которое вы не можете настроить с помощью некоторых параметров, но вы можете выполнить любое преобразование во всем выражении (например, линейное один или многочлен ...). Или вы можете использовать вариант GP, называемый мультигенным генетическим программированием (реализация в MATLAB - here, которая имеет параметры, которые могут быть настроены.

Если у вас меньше новых данных, чем требуется для модели, вы должны исправить некоторые параметры вручную, например, для линейной модели, можно сказать, что наклон остается неизменным, и только постоянная часть будет установлена.

1

Таким образом, 2 графы являются одинаковыми или масштабировании или сдвинуты друг с другом?


let (x,y) be your wanted point x is Известно y неизвестно
пусть (xx,yy) быть известной точкой во втором графике/данных
пусть известный граф будет источник граф

example

Итак:

  1. одни и те же графики

    найти ближайшие 2 точки в источнике данные (x0,y0),(x1,y1), где x0<=x и x<x1. Интерполяцию между ними, например, с помощью линейной интерполяции:

    y=y0+(y1-y0)*(x-x0)/(x1-x0) 
    
  2. масштабированные графики

    вычислить масштабируется исходный график, таким образом вычислить yy' из исходного графа для xx с помощью пули # 1. Шкала m=yy/yy' так yy=yy'*m Теперь просто вычислить y' из исходного графа для x с помощью пули # 1 и конвертировать в масштабе назначения графа так y=y'*m

  3. сдвинуты графы

    для этого вы должны знать, либо сдвиг сдвига или больше точек со второго графика. Сдвиг может происходить как в x, так и в y, поэтому вам необходимо применить коррекцию смещения xo,yo. Где y=y'+yo и x=x'+xo для передачи между графиками.

    Таким образом, вы найдете y' для (x-xo) и затем y=y'+yo

  4. масштабируется и сдвинутые графики

    просто объединить пули # 2, # 3

0

Вы можете применить генетическое программирование (GP) или один из его вариантов. У меня есть простое в использовании программное обеспечение с именем Multi Expression Programming X http://www.mepx.org, которое обнаруживает такие функции. Я загрузил свои данные в программе и у меня получил следующую функцию C:

#include <math.h> 
#include <stdio.h> 

void mepx(double *x /*inputs*/, double *outputs) 
{ 
//constants ... 
    double constants[5]; 
    constants[0] = 0.429823; 
    constants[1] = -0.327464; 
    constants[2] = -0.389508; 
    constants[3] = -0.315653; 


constants[4] = 0.166875; 

    double prg[22]; 
    prg[0] = x[0]; 
    prg[1] = cos(prg[0]); 
    prg[2] = constants[4]; 
    prg[3] = prg[0] + prg[1]; 
    prg[4] = pow(10, prg[1]); 
    prg[5] = sin(prg[0]); 
    prg[6] = -prg[1]; 
    prg[7] = constants[4]; 
    prg[8] = atan(prg[3]); 
    prg[9] = prg[4] * prg[6]; 
    prg[10] = prg[5] > prg[9]?prg[5] : prg[9]; 
    prg[11] = prg[6] < prg[7]?prg[6] : prg[7]; 
    prg[12] = atan(prg[10]); 
    prg[13] = tan(prg[4]); 
    prg[14] = prg[13] - prg[12]; 
    prg[15] = x[0]; 
    prg[16] = prg[8]/prg[2]; 
    prg[17] = sin(prg[14]); 
    prg[18] = prg[16] - prg[11]; 
    prg[19] = prg[18] + prg[17]; 
    prg[20] = prg[6]/prg[15]; 
    prg[21] = prg[19] - prg[20]; 

    outputs[0] = prg[21]; 
} 

int main(void) 
{ 

//example of utilization ... 

    double x[1]; 
    x[0] = 1.000000; 

    double outputs[1]; 

    mepx(x, outputs); 
    printf("%lf", outputs[0]); 
    getchar(); 
} 

Погрешность этой функции (расстояние к данным) составляет 0,32. Вы можете получить больше, если будете играть с параметрами программы.

Теперь вам нужно предоставить другие входы функции (другое x), и вы получите другое y.