Вычислить на ОМК

Mon Aug 07 2006 09:47, Dmitry E. Oboukhov wrote to Wladimir Tchernov:

WT>> В общем это ВАХ прямосмещенного германивого дида - какой она интересно WT>> функции подчиняется ? DEO> насколько я помню там чистая экспонента, а не логарифм. (U(I)) Типичная ВАХ диода - две разные экспоненты при больших и малых токах. Все это экземплярно и плавает на милливольты на градус. Точность - порядка 10%, если не принято особых мер по стабилизации и компенсации всего.

VLV

"Что даст мне свет, чего я сам не знаю?" (c) Гете "Фауст"

Reply to
Vladimir Vassilevsky
Loading thread data ...

Mon Aug 07 2006 10:49, Slav Matveev wrote to Vladimir Vassilevsky:

VV>> log2(x) ~ x - 0.957 SM> метод наименьших квадратов?

Минимизация максимальной ошибки. По МНК, возможно, получится немного по-другому, но все равно точность того же порядка.

VLV

"Что даст мне свет, чего я сам не знаю?" (c) Гете "Фауст"

Reply to
Vladimir Vassilevsky

Hello, Wladimir! You wrote to Kirill Frolov on Mon, 07 Aug 2006 14:20:24 +0600:

WT> 04 Авг 06 13:46, Kirill Frolov -> Andrey Arnold: DO>>>> я так понял линеаризация в нескольких диапазонах ??>>> Только число диапазонов не произвольное, а кратное степени числа ??>>> два и длина каждого одинакова. KF>> Я ничего не понял. Впрочем и не вникал. Хочу только сказать, что KF>> ничто не мешает отсортировать список аргументов функции и её KF>> значений и искать двоичным поиском за log2(N) времени, WT> А можно с этого места по подробнее, что-то никак не соображу. Тебе всё это лишнее. Тебе нужно считать стандартными в Це средствами, как тут уже несколько раз говорилось.

With best regards, Andrej Arnold. E-mail: snipped-for-privacy@aol.com

Reply to
Andrej Arnold

Пpивет, Wladimir!

*** 07 Aug 06 14:25, Wladimir Tchernov wrote to Vladislav Baliasov:

VB>> А почему и нет ? Компилятор делает именно это. И на ASM я делал VB>> так же (логарифмы заняли 113 слов программной памяти AVR,

WT> А исходным текстом не поделишся.

Hет, библиотека в целом имеет определенную ценность, и раздавать ее я не предполагал (а по своей сути базовая часть - это портированная библиотека плавучки из микрочиповской аппликухи). Принцип вычисления логарифма и значения коэффициентов взяты из библиотеки HI-Tech C для PIC.

с уважением Владислав

Reply to
Vladislav Baliasov

DO>> а вот чтобы отмасштабировать результат табличный до нужного надо DO>> подумать, похоже надо будет в степень основания вводить или корень DO>> брать. DO>> корень сложнее, а вот если основание и правда взять равным двум, то DO>> тут можно поиграться (но таблицу надо собирать для такого диапазона DO>> чтобы результат масштабировтаь только в бОльшую сторону) WT>

WT> Тоесть применить таблицу для аргументов 0,1-1, а затем еще и множители WT> (х10, х100 .... х100000) ? типа того (не знаю как логарифм разложится) ну и таблицу хорошо применять такую чтобы потом умножение деление было на 2 а не на 10 :) ну это уж как получится

Reply to
Dmitry E. Oboukhov

Hello Wladimir!

07 Aug 06 14:20, you wrote to Kirill Frolov:

WT> Функция нелинейна - быстро растет при малых аргуметах и мало меняется WT> при больших.

if((x&0xfff0) == 0) return(t1[x]); if((x&0xffe0) == 0){ if(x&1) return((t2[x-16] + t2[x-15]) >> 1); return(t2[x-16]); }; if((x&0xffc0) == 0) { if((x&3) == 2) return(t3[x-32] + t3[x-31]) >> 1); if((x&3) == 1) return(t3[x-32] * 3 + t3[x-31]) >> 2); if((x&3) == 3) return(t3[x-32] + t3[x-31] * 3) >> 2); /* и так далее */

Итого получается 12 сегментов по 17 слов, что меньше, чем 512 байт.

Кстати, я у себя, наверное, так и сделаю. Хотя бы потому, что аналитическое решение, занимая меньше места, не учитывает фактические погрешности измерителей, которые все равно надо убирать таблично.

WT> Получается для каждого из 4096 результатов надо задать свой диапазон WT> аргументов - а это 3-4 байта на ячейку таблицы. Причем у одних Hет. Поскольку функция вроде бы монотонна (Или это не так?), то вполне достаточно искать значение аргумента t[i] <= arg && arg < t[i+1]. Два байта на результат. WT> Все равно не понял. Двоичный поиск. Д.Кнут том 3.

Anatoly

Reply to
Anatoly Mashanov

Приветствую Вас, Vladimir!

VV>> Hет, не с аэромеха. Если видишь мудака - знай, что он с ФРТК VV>> (это про меня).

О. А ты когда там учился? Физхимов (ФМХФ) как обзывали?

С уважением, Виталий.

... -|O|-

Reply to
Vitaliy Romaschenko

Anatoly,

You wrote to Wladimir Tchernov:

WT>> Функция нелинейна - быстро растет при малых аргуметах и мало WT>> меняется при больших. AM> if((x&0xfff0) == 0) return(t1[x]); AM> if((x&0xffe0) == 0){ AM> if(x&1) return((t2[x-16] + t2[x-15]) >> 1); AM> return(t2[x-16]); AM> }; AM> if((x&0xffc0) == 0) { AM> if((x&3) == 2) return(t3[x-32] + t3[x-31]) >> 1); AM> if((x&3) == 1) return(t3[x-32] * 3 + t3[x-31]) >> 2); AM> if((x&3) == 3) return(t3[x-32] + t3[x-31] * 3) >> 2); AM> /* и так далее */ AM>

AM> Итого получается 12 сегментов по 17 слов, что меньше, чем 512 байт.

Hичего не понял. Сколько тут массивов и каких они размеров? Зачем нужны эти бесконечные сравнения в старшОй части адреса? Какая получается в итоге в данном случае точность? А в "и так далее" у тебя в младшОм адресе будет до 16 сравнений? Я всё правильно понял?

AM> Кстати, я у себя, наверное, так и сделаю. Хотя бы потому, что AM> аналитическое решение, занимая меньше места, не учитывает фактические AM> погрешности измерителей, которые все равно надо убирать таблично.

Разумеется.

WT>> Получается для каждого из 4096 результатов надо задать свой WT>> диапазон аргументов - а это 3-4 байта на ячейку таблицы. Причем у WT>> одних AM> Hет. Поскольку функция вроде бы монотонна (Или это не так?),

Так, так.

AM> то вполне достаточно искать значение аргумента t[i] <= arg && arg < AM> t[i+1]. Два байта на результат.

Так сколько у тебя превычесленных точек всё же?

Andrey

Reply to
Andrey Arnold

linux тут никакого отношения не имеет. s/linux/gnu libc/. Только вот посллалл так послал... НАшёл куда. Тудас (в glibc) лучше и не соваться.

Reply to
Kirill Frolov

KF>

KF> linux тут никакого отношения не имеет. s/linux/gnu libc/. KF> Только вот посллалл так послал... HАшёл куда. Тудас (в glibc) KF> лучше и не соваться. почему лучше не соваться? я помнится туда заглядывал в поисках посмотреть как iconv работает, вполне себе библиотека :) просто надо научиться поиском пользоваться (grep/egrep), иначе действительно в таком огромном объеме кода долго искать нужную функцию придется ;)

Reply to
Dmitry E. Oboukhov

Доброго времени суток тебе Dmitry!

07 Авг 06 09:47, Dmitry E. Oboukhov -> Wladimir Tchernov:

WT>> В общем это ВАХ прямосмещенного германивого дида - какой она WT>> интересно функции подчиняется ? DO> насколько я помню там чистая экспонента, а не логарифм. (U(I))

Да - меня в схемсах просветили - а у меня на выходе именно логарифм. Буду разбираться.

Будь счастлив(а) Dmitry... С уважением Wladimir.

Reply to
Wladimir Tchernov

Доброго времени суток тебе Kirill!

07 Авг 06 10:46, Kirill Frolov -> Wladimir Tchernov:

KF> Стандартная библиотека языка C.

Уже посмотрел - нее я не настолько умный, что-бы понять КАК ЭТО РАБОТАЕТ :)

Попробую все-же по таблицам.

KF> А зачем второй нужен? :-/

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

Будь счастлив(а) Kirill... С уважением Wladimir.

Reply to
Wladimir Tchernov

Доброго времени суток тебе Nicolas!

07 Авг 06 09:07, Nicolas Minakov -> Wladimir Tchernov:

YK>>> Реально. AVR на частоте в 1МГц хватит за глаза. :-)

YK>>> ATtiny26 @11MHz : Длительность импульса ~700мксек.

YK>>> IAR C/C++ Compiler for AVR YK>>> 4.20A/W32 (4.20.1.3)

YK>>> U16 func(U16 X)

NM> Тип переменной.

Понял.

YK>>> { YK>>> #define A 100.0 YK>>> #define B 50000.0

YK>>> return (U16)(A*log10(B*X)); YK>>> } YK>>> //-------------------------------------------------------------- YK>>> ----- __C_task void main(void) { // PORTA = c;

YK>>> DDRA = BINARY(11100000); YK>>> PORTA = BINARY(11100000);

YK>>> DDRB = BINARY(01101000); YK>>> PORTB = BINARY(01100000);

YK>>> for (;;) YK>>> { YK>>> U16 x = func(598);

YK>>> led_on();

NM> Как ты время, необходимое для расчета померять собираешься?

А процедуры то нема :)

YK>>> x = func(450); YK>>> led_off(); YK>>> } YK>>> }

NM> Вопервых необязательно иар. Скачай винавр и аврстудию,

Я в АВР студии и пишу. 4.2 ... Только на ассемблере.

NM> кракать не NM> надо. Вовторых ты невнимательно эху читаешь (отн. иара)... Если NM> всетаки winavr - посмотри в аврлибсе, там есть модуль math.h.

NM> ∙ double log (double __x) __ATTR_CONST__ NM> ∙ double log10 (double __x) __ATTR_CONST__

NM> После компиляции симулятор аврстудии с твоей задачей справится без NM> проблем. И обрати внимание, что тут уже писали о логарифмах (умножение NM> -> сложение). Однако и вопросы у тебя...

Сложновато мне выражать свои мысли и знаний маловато.

Будь счастлив(а) Nicolas... С уважением Wladimir.

Reply to
Wladimir Tchernov

Доброго времени суток тебе Vladislav!

07 Авг 06 20:46, Vladislav Baliasov -> Wladimir Tchernov:

VB>>> А почему и нет ? Компилятор делает именно это. И на ASM я делал VB>>> так же (логарифмы заняли 113 слов программной памяти AVR,

WT>> А исходным текстом не поделишся.

VB> Hет, библиотека в целом имеет определенную ценность, и раздавать ее я VB> не предполагал (а по своей сути базовая часть - это портированная VB> библиотека плавучки из микрочиповской аппликухи). Принцип вычисления VB> логарифма и значения коэффициентов взяты из библиотеки HI-Tech C для VB> PIC.

Hо она без исходников - тоесть дизассемблировал ? Даааа...

Будь счастлив(а) Vladislav... С уважением Wladimir.

Reply to
Wladimir Tchernov

Доброго времени суток тебе Dmitry!

07 Авг 06 23:51, Dmitry E. Oboukhov -> Wladimir Tchernov:

DO>>> а вот чтобы отмасштабировать результат табличный до нужного надо DO>>> подумать, похоже надо будет в степень основания вводить или DO>>> корень DO>>> брать. DO>>> корень сложнее, а вот если основание и правда взять равным двум, DO>>> то DO>>> тут можно поиграться (но таблицу надо собирать для такого DO>>> диапазона DO>>> чтобы результат масштабировтаь только в бОльшую сторону) WT>>

WT>> Тоесть применить таблицу для аргументов 0,1-1, а затем еще и WT>> множители (х10, х100 .... х100000) ? DO> типа того (не знаю как логарифм разложится) DO> ну и таблицу хорошо применять такую чтобы потом умножение деление было DO> на 2 а не на 10 :) DO> ну это уж как получится

Должно получиться.

Будь счастлив(а) Dmitry... С уважением Wladimir.

Reply to
Wladimir Tchernov

Доброго времени суток тебе Vladimir!

07 Авг 06 18:35, Vladimir Vassilevsky -> Dmitry E. Oboukhov:

WT>>> В общем это ВАХ прямосмещенного германивого дида - какой она WT>>> интересно функции подчиняется ? DEO>> насколько я помню там чистая экспонента, а не логарифм. (U(I))

VV> Типичная ВАХ диода - две разные экспоненты при больших и малых VV> токах. Все это экземплярно и плавает на милливольты на градус. VV> Точность - порядка 10%, если не принято особых мер по стабилизации VV> и компенсации всего.

Это я уже понял, причем сам ток диода его-же и греет....

Буду я в общем снимать ВАХ с этих диодов.

Будь счастлив(а) Vladimir... С уважением Wladimir.

Reply to
Wladimir Tchernov

WT> Уже посмотрел - нее я не настолько умный, что-бы понять КАК ЭТО РАБОТАЕТ :) возьми книжку тогда Г.Корн Т.Корн по математике и выбери численный метод по вкусу ;)

Reply to
Dmitry E. Oboukhov

Как это работает объясняется на первом курсе института подходящей направленности. Впрочем, понимать не обязательно. Достаточно взять и использовать.

Размеры таблиц должны быть внушительные...

Reply to
Kirill Frolov

Большая и сложная. Это примерно как пытаться понять принцип работы двигателя внутреннего сгорания на примере современного автомобиля -- бесполезно.

А оно, случайно, log.c не называется? Впрочем, для этого есть такие средства как sourcenavigator, cscope, ctags наконец.

Reply to
Kirill Frolov

У тебя есть список пар [аргумент, значение]. Массив с ними, если ещё не, отсортировываешь по аргументу. Потом когда надо найти две пары (для линейной интерполяции) слева и справа от имеющегося аргумента ищешь посредством двоичного поиска (в электронике известен как метод последовательного приближения) -- берёшь значение в середине массива. Если у тебя аргумент меньше -- берёшь далее значение в середине левой половины, а иначе в середине правой. И так в цикле, пока не найдёшь две соседних пары [аргумент, значение].

Вот вопрос как построить список и сколько выбрать пар и с каким шагом между ними чтоб получить заданную тобой максимальную погрешность. Задача может быть решена методом похожим на описанный выше: разбиваешь пополам, считаешь погрешность, если не подходит, разбиваешь ещё пополам, иначе разбиваешь пополам "остаток" и так далее... Это -- построение списока -- делается, естесственно, не в контроллере в реальном времени, а в пц.

Ничего не понял. У тебя на N элементов твоей таблицы будет приходиться две пары [аргумент, значение]. В пределе -- две таких пары на всю таблицу. Т.е. там не 4096 пар будет, а существенно меньше. Насколько существенно зависит от допускаемой погрешности. Речь именно об аппрокимации -- приближении твоей функции, а не вычислении точного значения. Нужна высокая точность -- аппроксимируй функциями бОльших степеней. Нужна непрерывность N-й производной -- сплайн. Нужны точные значения -- храни таблицу поправок к аппроксимирующей функции. Таблица будет меньше за счёт меньшей разрядности каждого элемента. Можешь, наконец, из степенных функций составлять свою кривую. Вариантов масса...

Что именно? Это, практически, типовая задача и для неё существуют типовые решения.

Reply to
Kirill Frolov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.