Технический форум по робототехнике.
Vooon » 23 авг 2007, 19:05
вобщем нуна ф-ция
которая выполнит сабжевую проблему.
есть некий график нелинейный, я его разбиваю на отрезки - с этим все ок
(сглаживание ненать)
а вот как потом узнать скажем Y точки лежащей на каком-то отрезке, если известен X...
(как найти нужный отрезок и сам потом "придумаю" а вот точку на отрезке чтот никак - видать переотдыхал
)
что-то пока думаю об итерациях...
Добавлено:массив точек навроде такого:
- Код: Выделить всё • Развернуть
const float dat_alfa0[][2] = {
/* x , y */
{ 0 , 0 },
{ 10.245517, 0.035386632 },
{ 20.147485, 0.072188729 },
{ 30.049453, 0.10969856 },
{ 40.157712, 0.14579292 },
{ 50.05968 , 0.18047182 },
{ 60.167939, 0.21656619 },
{ 70.069907, 0.25195282 }
};
Vooon » 23 авг 2007, 23:50
все... побил стены лбом, очухался... вспомнил чуток геометрию :lol:
написал так:
- Код: Выделить всё • Развернуть
/**
* вычисляет вторую координату точки на графике.
* точка ДОЛЖНА быть на графике!
*/
/**
* Вычисляет абсциссу
*/
float graph_get_x (const float graph, float y)
{
unsigned int i;
for (i = 0; i <= (sizeof(graph)/(2*sizeof(graph[0][0]))); i++)
{
if (graph[i][1] <= y && y <= graph[i+1][1]) break;
}
return graph_get_coord_x(graph[i][0], graph[i][1], graph[i+1][0], graph[i+1][1], y);
}
/**
* Вычисляет ординату
*/
float graph_get_y (const float graph, float x)
{
unsigned int i;
for (i = 0; i <= (sizeof(graph)/(2*sizeof(graph[0][0]))); i++)
{
if (graph[i][0] <= x && x <= graph[i+1][0]) break;
}
return graph_get_coord_y(graph[i][0], graph[i][1], graph[i+1][0], graph[i+1][1], x);
}
/**
* A (x1; y1) - start
* B (x2; y2) - stop
* x (y) - one of C
*/
#define graph_get_coord_x ( x1, y1, x2, y2, y) \
graph_get_coord_y ( y1, x1, y2, x2, y)
float graph_get_coord_y (float x1, float y1, float x2, float y2, float x)
{
return (((y2 - y1)*(x - x1))/(x2 - x1)+ y1);
}
Myp » 24 авг 2007, 11:39
а я вобще ничерта не понял
ни то чё ты хотел не то чё ты сделал...
какой же это тогда вопрос для начинающих ?
а самое интересное зачем оно тебе надо было ?:)
Digit » 24 авг 2007, 13:00
Я тож не сильно понял, чего надо было... Но если есть начало отрезка и конец (координаты), то найти одну из координат точки на отрезке - это класс 6-7 геометрии :lol: Так что точно для начинающих :P
Vooon » 24 авг 2007, 13:19
зачем - есть датчик, и его выходное напряжение идет не линейно с измеряемым параметром.
в ДШ например есть график показывающий изменение напряжения на выходе от изменения входного параметра.
так вот - я этот график оцифровываю - получается много отрезков.
так вот зная входное напряжение (АЦП) мне нужно было преобразовать в ту величину
=> по извесной одной координате найти вторую...
всеравно наверн непонятно написал...
а в новички - т.к на мой взгляд этот форум как нельзя лучше подходит
Vooon » 24 авг 2007, 13:20
Digit писал(а):Я тож не сильно понял, чего надо было... Но если есть начало отрезка и конец (координаты), то найти одну из координат точки на отрезке - это класс 6-7 геометрии :lol: Так что точно для начинающих :P
ага, я просто наверн переотдыхал... ниче не помню, просто тупо открыл мучебник и нашел
Myp » 24 авг 2007, 17:35
Vooon писал(а):всеравно наверн непонятно написал...
вот как раз теперь понятно
сам когдато над этим вопросом думал, для применения датчикой с нелинейными хар-ками
Vooon » 24 авг 2007, 20:50
Myp писал(а):вот как раз теперь понятно
сам когдато над этим вопросом думал, для применения датчикой с нелинейными хар-ками
и че надумал? :)
SSG » 25 авг 2007, 14:47
А насколько большая разность между точками и как сильно меняются значения функции, в зависимости от разных параметров? Может выгоднее аппроксимацию замутить, вычислить один раз на большом ПК коэффициенты, например, полинома по уже имеющимся значениям и потом уже с его (полинома или более другой подходящей функции) помощью в контроллере считать? 8)
Myp » 25 авг 2007, 18:59
Vooon писал(а):Myp писал(а):вот как раз теперь понятно
сам когдато над этим вопросом думал, для применения датчикой с нелинейными хар-ками
и че надумал? :)
а ничё
плюнул на это дело = )))
типа такого, сначала на бумажке посчитать, а потом в мк загнать
если Х от нуля до десяти то У = (2Х)
если Х от 10 до 20 то У = (2Х) - 3
если Х от 20 до 30 то У = (2Х) - 7
Digit » 26 авг 2007, 14:34
...это называется "табличное представление функции"
SSG » 26 авг 2007, 21:41
Ну так если значения в таблице постоянны, конечно лучше какой-нибудь аппроксимирующий полином или другую функцию на ПК рассчитать. Тогда программа для контроллера поэлегантней получится. :) Кроме того, это позволит находить значения функции и в промежуточных точках, для которых измерения не проводились.
Виталий » 26 авг 2007, 21:51
Тогда программа для контроллера поэлегантней получится
Но она будет медленней =)
SSG » 27 авг 2007, 12:56
Виталий писал(а):Но она будет медленней =)
Почему?
Digit » 27 авг 2007, 12:57
SSG писал(а):Кроме того, это позволит находить значения функции и в промежуточных точках, для которых измерения не проводились.
...а кроме того, что прога будет тормознутее, за пределами рассчитанного полинома могут быть редкостные косяки
Скажем так, за пределами табличных значений можно найти результат с приемлемой точностью только для относительно простых функций. А между точками таблицы можно и линейную апроксимацию иметь - точность будет зависеть от количества точек в таблице...
А вообще, это традиционный спор из разряда "размер кода VS быстрота" :lol:
ЗЫ
Медленнее будет, т.к. надо будет гораздо больше считать. Мы не берем во внимание линейные функции и другие простые функции. А посчитать полином шестой степени - это относительно много математики. По крайней мере, больше, чем взять число из таблицы и линейно проинтерполировать.