Технический форум по робототехнике.
Vooon » 23 авг 2007, 19:05
вобщем нуна ф-ция
которая выполнит сабжевую проблему.
есть некий график нелинейный, я его разбиваю на отрезки - с этим все ок
(сглаживание ненать)
а вот как потом узнать скажем Y точки лежащей на каком-то отрезке, если известен X...
(как найти нужный отрезок и сам потом "придумаю" а вот точку на отрезке чтот никак - видать переотдыхал
![Confused :?](http://roboforum.ru/images/smilies/icon_confused.gif)
)
что-то пока думаю об итерациях...
Добавлено:массив точек навроде такого:
- Код: Выделить всё • Развернуть
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
ага, я просто наверн переотдыхал... ниче не помню, просто тупо открыл мучебник и нашел
![Smile :)](http://roboforum.ru/images/smilies/icon_smile.gif)
Myp » 24 авг 2007, 17:35
Vooon писал(а):всеравно наверн непонятно написал...
вот как раз теперь понятно
![Smile :)](http://roboforum.ru/images/smilies/icon_smile.gif)
сам когдато над этим вопросом думал, для применения датчикой с нелинейными хар-ками
Vooon » 24 авг 2007, 20:50
Myp писал(а):вот как раз теперь понятно
![Smile :)](http://roboforum.ru/images/smilies/icon_smile.gif)
сам когдато над этим вопросом думал, для применения датчикой с нелинейными хар-ками
и че надумал? :)
SSG » 25 авг 2007, 14:47
А насколько большая разность между точками и как сильно меняются значения функции, в зависимости от разных параметров? Может выгоднее аппроксимацию замутить, вычислить один раз на большом ПК коэффициенты, например, полинома по уже имеющимся значениям и потом уже с его (полинома или более другой подходящей функции) помощью в контроллере считать? 8)
Myp » 25 авг 2007, 18:59
Vooon писал(а):Myp писал(а):вот как раз теперь понятно
![Smile :)](http://roboforum.ru/images/smilies/icon_smile.gif)
сам когдато над этим вопросом думал, для применения датчикой с нелинейными хар-ками
и че надумал? :)
а ничё
плюнул на это дело = )))
типа такого, сначала на бумажке посчитать, а потом в мк загнать
если Х от нуля до десяти то У = (2Х)
если Х от 10 до 20 то У = (2Х) - 3
если Х от 20 до 30 то У = (2Х) - 7
Digit » 26 авг 2007, 14:34
...это называется "табличное представление функции"
![Smile :)](http://roboforum.ru/images/smilies/icon_smile.gif)
SSG » 26 авг 2007, 21:41
Ну так если значения в таблице постоянны, конечно лучше какой-нибудь аппроксимирующий полином или другую функцию на ПК рассчитать. Тогда программа для контроллера поэлегантней получится. :) Кроме того, это позволит находить значения функции и в промежуточных точках, для которых измерения не проводились.
Виталий » 26 авг 2007, 21:51
Тогда программа для контроллера поэлегантней получится
Но она будет медленней =)
SSG » 27 авг 2007, 12:56
Виталий писал(а):Но она будет медленней =)
![Shocked :shock:](http://roboforum.ru/images/smilies/icon_eek.gif)
Почему?
Digit » 27 авг 2007, 12:57
SSG писал(а):Кроме того, это позволит находить значения функции и в промежуточных точках, для которых измерения не проводились.
...а кроме того, что прога будет тормознутее, за пределами рассчитанного полинома могут быть редкостные косяки
![Wink ;-)](http://roboforum.ru/images/smilies/icon_wink.gif)
Скажем так, за пределами табличных значений можно найти результат с приемлемой точностью только для относительно простых функций. А между точками таблицы можно и линейную апроксимацию иметь - точность будет зависеть от количества точек в таблице...
А вообще, это традиционный спор из разряда "размер кода VS быстрота" :lol:
ЗЫ
Медленнее будет, т.к. надо будет гораздо больше считать. Мы не берем во внимание линейные функции и другие простые функции. А посчитать полином шестой степени - это относительно много математики. По крайней мере, больше, чем взять число из таблицы и линейно проинтерполировать.