LINUX.ORG.RU

аппрокcимировать данные sqrt(x),x^2

 , аппроксимация


0

1

есть данные x,y - одни наборы вроде как ложатся на sqrt(x), другие как x^2.

у кого-нить есть под рукой код аппроксимации на любимом «C» ? чтобы не писать лишнего. Набросать программу и проверить

PS/ матрицы вспоминать уже давно не тот возраст, и цитаты из гугля приводить не надо - дайте код :-)

★★★★★

Можно еще в LibreOffice Calc построить на графике линию тренда (полиномиальная регрессия)

SZT ★★★★★
()
Ответ на: комментарий от SZT

Можно еще в LibreOffice Calc построить на графике линию тренда (полиномиальная регрессия)

про либру я как-то и так знал :-) иначе не смог бы сказать «одни наборы вроде как ложатся на sqrt(x), другие как x^2.». Но файлов и данных много и хочется все проверить

за наводку на gsl и конкретный код - спасибо ! сижу разбираюсь..

MKuznetsov ★★★★★
() автор топика
Последнее исправление: MKuznetsov (всего исправлений: 1)

Вычисли вторую производную в нескольких точках. Для x^2 должна быть константа близкая к 2.

Liz812
()

Любой питон, р или октейв в помощь. Правильный алгоритм в таком случае:

  1. Вместо (x, y) следует рассматривать (ln x, ln y).
  2. Подгон данных под прямую с помощью МНК.
  3. В полученном ln y = a ln x + b коэффициент a даёт как раз показатель степени.

А чтобы потом сделать совсем правильно, дальше следует читать литературу по матстатистике: МНК, доверительные интервалы и проверка гипотез.

anonymous
()
Ответ на: комментарий от knovich

Не очень хороший способ.

Да хрен там. Переходишь к конечным разностям, находишь производную (линейную) и по ней получаешь аппроксимирующую функцию.

anonymous
()
Ответ на: комментарий от anonymous

Вместо (x, y) следует рассматривать (ln x, ln y).

Подгон данных под прямую с помощью МНК.

В полученном ln y = a ln x + b коэффициент a даёт как раз показатель степени

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

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

Спасибо !

MKuznetsov ★★★★★
() автор топика
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от Liz812

да тут можно в логарифмическом масштабе построить и посмотреть.

ZERG ★★★★★
()

Попробуй ceres-solver (у него есть и C API). http://ceres-solver.org/nnls_tutorial.html#curve-fitting

Может показаться что это из ‘пушки по воробъям’, но оно того стоит. Для ceres-solver твоя задача переформулируется как найти коэфициенты a,b, такие что минимизируется сумма квадратов невязки модели a * sqrt(x) + b*x^2 к твоим данным. Производные ceres-solver посчитает сам унутри.

Если убрать твое требование «на любимом «C»», то для ‘быстренько потыкать палочкой, не расчехляя компилятор’, я бы выбрал mathematica и функцию Fit.

nikitos ★★★
()

Я раза 4 перечитал пост и ничего не понял.

Те люди, которые здесь писали ответы понимают что они сами написали?

ТС - ты указал:

есть данные x,y

одни наборы вроде как ложатся на sqrt(x), другие как x^2

Где собственно игрек и что ты спрашиваешь? Аппроксимация чего конкретно тебе нужна?

HIS
()
Ответ на: комментарий от HIS

Ну а в чем проблема?

Например, есть точки для x и y, типа x = {0, 1, 2, 3, 4, 5}; y = {0, 1, 4, 9, 16, 25} и это похоже на y = x^2.

Или точки типа x = {0, 1, 4, 9, 16, 25}; y = {0, 1, 2, 3, 4, 5} и это похоже на y = sqrt(x).

Надо эти данные приблизить чем-то вроде y = x^n + c

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 2)
Ответ на: комментарий от SZT

Хочу получить точное развёрнутое ТЗ, а не какие-то странные догадки что ТС сам себе недовообразил.

HIS
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.