суббота, 11 августа 2018 г.

Статистические справочные таблицы на калькуляторе

Задача. Есть калькулятор, но нет под рукой статистических таблиц. Например, нужны таблицы критических точек распределения Стьюдента для вычисления доверительного интервала. Взять компьютер с Excel? Не спортивно.
Большая точность не нужна, можно воспользоваться приближенными формулами. Идея приведённых ниже формул состоит в том, что преобразованием аргумента все распределения можно так или иначе свести к нормальному. Аппроксимации должны обеспечивать как вычисление кумулятивной функции распределения, так и расчет обратной к ней функции.
Начнём с нормального распределения. $$\Phi(z)=P=\frac{1}{2}\left[1+\mathrm{erf}\left(\frac{z}{\sqrt{2}}\right)\right]$$ $$z=\Phi^{-1}(P)=\sqrt{2}\cdot\mathrm{erf}^{-1}(2P-1)$$
Для него требуется вычислить функцию \(\mathrm{erf}(x)\) и обратную к ней. Я воспользовался приближением [1]: $$ \mathrm{erf}(x)=\mathrm{sign}(x)\cdot\sqrt{1-\exp\left(-x^{2}\cdot\frac{\frac{4}{\pi}+ax^{2}}{1+ax^{2}}\right)} $$ $$ \mathrm{erf}^{-1}(x)=\mathrm{sign}(x)\cdot\sqrt{-t_{2}+\sqrt{t_{2}^{2}-\frac{1}{a}\cdot\ln t_{1}}} $$ где \(t_1\) и \(t_2\) вспомогательные переменные: $$ t_{1}=1-x^{2},\:t_{2}=\frac{2}{\pi a}+\frac{\ln t_{1}}{2} $$ а константа \(a=0.147\). Ниже дан код на языке Octave.
function y = erfa(x)
  a  = 0.147;
  x2 = x**2; t = x2*(4/pi + a*x2)/(1 + a*x2);
  y  = sign(x)*sqrt(1 - exp(-t));
endfunction
function y = erfinva(x)
  a  = 0.147; 
  t1 = 1 - x**2; t2 = 2/pi/a + log(t1)/2;
  y  = sign(x)*sqrt(-t2 + sqrt(t2**2 - log(t1)/a));
endfunction

function y = normcdfa(x)
  y = 1/2*(1 + erfa(x/sqrt(2)));
endfunction
function y = norminva(x)
  y = sqrt(2)*erfinva(2*x - 1);
endfunction
Теперь, когда есть функции нормального распределения, приведём аргумент и вычислим t-распределение Стьюдента [2]: $$ F_{t}(x,n)=\Phi\left(\sqrt{\frac{1}{t_{1}}\cdot\ln(1+\frac{x^{2}}{n})}\right) $$ $$ t=F_{t}^{-1}(P,n)=\sqrt{n\cdot\exp\left(\Phi^{-1}(P)^{2}\cdot t_{1}\right)-n} $$ где вспомогательная переменная \(t_1\) есть $$ t_{1}=\frac{n-1.5}{(n-1)^{2}} $$
function y = tcdfa(x,n)
  t1 = (n - 1.5)/(n - 1)**2;
 y = normcdfa(sqrt(1/t1*log(1 + x**2/n)));
endfunction
function y = tinva(x,n)
  t1 = (n - 1.5)/(n - 1)**2;
  y  = sqrt(n*exp(t1*norminva(x)**2) - n);
endfunction
Идея приближенного вычисления распределения \(\chi^{2}\) наглядно представлена формулами [3]: $$ \sigma^{2}=\frac{2}{9n},\:\mu=1-\sigma^{2} $$ $$ F_{\chi^{2}}(x,n)=\Phi\left(\frac{\left(\frac{x}{n}\right)^{1/3}-\mu}{\sigma}\right) $$ $$ \chi^{2}=F_{\chi^{2}}^{-1}(P,n)=n\cdot\left(\Phi^{-1}(P)\cdot\sigma+\mu\right)^{3} $$
function y = chi2cdfa(x,n)
  s2 = 2/9/n; mu = 1 - s2;
  y  = normcdfa(((x/n)**(1/3) - mu)/sqrt(s2));
endfunction
function y = chi2inva(x,n)
 s2 = 2/9/n; mu = 1 - s2;
  y = n*(norminva(x)*sqrt(s2) + mu)**3;
endfunction
Распределение Фишера (для \(n/k\geq3\) и \(n\geq3\)) находится в два шага. Сначала аргумент преобразуется к вычислению распределения Фишера через распределение \(\chi^{2}\) [4], а его мы уже знаем, как вычислить. $$ \sigma^{2}=\frac{2}{9n},\:\mu=1-\sigma^{2} $$ $$ \lambda=\frac{2n+k\cdot x/3+(k-2)}{2n+4k\cdot x/3} $$ $$ F_{f}(x;k,n)=\Phi\left(\frac{\left(\lambda\cdot x\right)^{1/3}-\mu}{\sigma}\right) $$ Найдём обратную функцию, решив квадратное уравнение. $$ q=\left(\Phi^{-1}(P)\cdot\sigma+\mu\right)^{3} $$ $$ b=2n+k-2-4/3\cdot kq $$ $$ D=b^{2}+8/3\cdot knq $$ $$ x=F_{f}^{-1}(P;k,n)=\frac{-b+\sqrt{D}}{2k/3} $$
function y = fcdfa(x,k,n)
  mu = 1-2/9/k; s = sqrt(2/9/k);
  lambda = (2*n + k*x/3 + k-2)/(2*n + 4*k*x/3);
  normcdfa(((lambda*x)**(1/3)-mu)/s)
endfunction
function y = finva(x,k,n)
  mu = 1-2/9/k; s = sqrt(2/9/k);
  q = (norminva(x)*s + mu)**3;
  b = 2*n + k-2 -4/3*k*q;
  d = b**2 + 8/3*k*n*q;
  y = (sqrt(d) - b)/(2*k/3);
endfunction

Список литературы

  1. Sergei Winitzki. A handy approximation for the error function and its inverse. February 6, 2008.
  2.  Gleason J.R. A note on a proposed Student t approximation // Computational statistics & data analysis. – 2000. – Vol. 34. – №. 1. – Pp. 63-66.
  3.  Wilson E.B., Hilferty M.M. The distribution of chi-square // Proceedings of the National Academy of Sciences. – 1931. – Vol. 17. – №. 12. – Pp. 684-688.
  4.  Li B. and Martin E.B. An approximation to the F-distribution using the chi-square distribution. Computational statistics & data analysis. – 2002. Vol. 40. – №. 1. pp. 21-26.

воскресенье, 5 августа 2018 г.

Молекулярные структуры в векторной графике

Задача следующая. Требуется отрисовать молекулу или кристалл в формате векторной графики. Причем, файл не просто должен иметь расширение SVG или подобное ему, а содержать удобные графические примитивы: атомы и связи. Это нужно для удобства дальнейшего редактирования, например, вот такого:
Преимущества в том, что рисунок масштабируется от маленького формата Graphical Abstract до размеров постера A0. На нём можно разместить стрелки движения атомов в ходе реакции, подписать важные фрагменты и убрать акценты с малозначимых деталей.
Нам поможет программа MOLDEN - a pre- and post processing program of molecular and electronic structure. Molden понимает множество форматов выходных файлов от квантовохимических и структурных программ: PDB, CIF и т.п. Выглядит он так:
Открываем файл со структурой, поворачиваем её наилучшим образом и экспортируем в PostScript. Откроем получившийся файл текстовым редактором и увидим:
%!PS-Adobe-2.0 EPSF-2.0
%%Title: Molden
%%For: Schaft
%%Creator: Drs G Schaftenaar
%%DocumentFonts: Courier
%%Pages (atend)
%%BoundingBox: 0 0 612 792
%%EndComments
%
%###### User Preferences ############
%
%---- SIZE AND ORIENTATION OF THE PLOT ---
%
/size    {  0.24 } def
%---- These number can be negative -------
/originx {  39.0 } def
/originy { 753.0 } def
/angle   { -90.0 } def
%For Portrait use
%/originx { 40.0 } def
%/originy { 240.0 } def
%/angle   { 0.0 } def
%and BoundingBox: 25 255 535 765
%
%---- COLORS FOR DENSITY CONTOURS  -------
%
/poscontour { 18 } def
/negcontour { 19 } def
...
Это описание графики, к счастью, не на низком уровне, а на уровне тех самых графических объектов, которыми мы собрались оперировать.
/titleandlogo {false} def % мы заменили true на false для отключения печати логотипа
Атомы отрисовываются процедурой /doatom, а связи - процедурой /dorod. Упростим эти процедуры, чтобы уменьшить число графических примитивов и сделать рисунок легче.
% процедура рисует концентрические круги - атом
/doatom
{ gsave
  rx ry translate
  90 -1 1 % поставив здесь 90 -10 1 мы существенно упростим рисунок
  { gsave
    dup cos hue exch satu exch sethsbcolor sin dup scale
    newpath
    0 0 rad 0 360 arc
    closepath fill grestore } for
    grestore } def
% процедура рисует связь
/shadedrod
{ gsave
  x1 y1 translate
  x2 x1 neg add
  y2 y1 neg add
  {atan neg rotate} stopped not {
  87 -3 0 % здесь можно поставить 87 -20 0
  {dup
  gsave
  newpath
   cos 1.0 cosb 0.5 mul neg add mul
   hue exch satu exch sethsbcolor
   sin 1.0 scale
   1 cosb scale
   0 0 hd 0 180 arcn
   x2 x1 neg add dup mul
   y2 y1 neg add dup mul
   add sqrt
  0 cosb eq {/cosb 1.0 def} if 0 exch cosb div translate
   0 0 hd 180 360 arc
  closepath fill
  grestore } for
  } if
  grestore } def
При большом желании можно переписать эти процедуры полностью на свой вкус, понадобится учебник языка PostScript и несколько проб. Я ограничился минимальной правкой с одной лишь целью - кардинально уменьшить число кругов и линий, так потом проще редактировать файл в программе Inkscape. Радикальное упрощение позволяет создать такой рисунок:
А способ, описаный выше - вот такой:


суббота, 4 августа 2018 г.

Оцифровка функции с картинки

Задача. У Вас есть спектр, график функции на картинке (фотографии) в статье или книжке. Требуется перевести его в цифровой вид для дальнейшей обработки. 
Например, хочется перевести в цифру распределение частиц с картинки ниже.
Устанавливаем программу engauge-digitizer - interactively extracts numbers from bitmap graphs or maps:
sudo apt-get install engauge-digitizer
Запускаем engauge. Импортируем изображение. На изображении указываем 3 точки для задания координат: (0, 0), (0, 16), (70, 0). Они обозначены красными крестиками. 
Программа engauge пробует сама найти сегменты кривых (нужно нажать пиктограмму с зеленой полоской). Удерживая Shift выделяем мышью все относящиеся к делу сегменты. Появляются синие крестики - оцифрованные точки кривой. Сохраняем файл, экспортируем данные в формат *.CSV. 
Я предпочитаю рисовать графики программой Gnuplot, потому подправляю исходный текстовый файл CSV до такого:
#x Curve1
2.31405 0.20000
2.97521 0.714777
3.30579 1.2646
...
Теперь можно нарисовать график. Однако, дальнейшая работа с данными может оказаться не совсем удобной, так как точек хотя и достаточно для рисунка, но мало для дальнейшего математического анализа. Поможет простой рецепт, код на Octave:
[a,b] = textread("srep20589-f1.csv","%f %f","headerlines",1);
N = 1024;
xi = linspace(min(a),max(a),N)';
yi = griddatan(a,b,xi);
Так мы сделали равномерную сетку по \(x\) и увеличили линейной интерполяцией число точек до 1024.
На происхождение данных всё еще указывает зубчатый характер графика, видный при увеличении. Воспользуемся преобразованием Фурье для сглаживания кривой.
n=[-N/2:N/2]; n(N+1) = []; freq = n./N;
% построим фильтр, отсекающий высокие частоты
b_order = 10; w_c = 0.01;
w = sqrt(1./(1+(freq./w_c).^b_order))';
w = fftshift(w);
и сравним результаты до и после фильтрации:
hold on
plot(xi, yi)
plot(xi, ifft(fft(yi).*w))

воскресенье, 7 января 2018 г.

Библиографический поиск

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

Основы: Википедия

Прежде чем искать информацию о чём-то, получите хотя бы базовое представление о предмете. Например, тема реферата: иммуноферментный анализ. Википедия как раз создана для решения этой задачи, для первого шага в поиске информации. К сожалению, некоторые люди думают, что статья в википедии должна быть актуальной, популярно изложенной и исчёрпывающей предмет. Всё как будто чтобы остановиться на ней и более не возвращаться к предмету. В корне неверно!
Недопустимость оригинальных исследований — одно из основополагающих правил Википедии. Так что если хотите остаться с информацией второго сорта свежести — ограничьте себя чтением Википедии и только.
Из статьи в Википедии мы получим первичные ссылки на книги, обзоры, поймём общепринятую терминологию в предметной области и с её помощью сформулируем поисковые запросы.

Поиск: Академия Google и ResearchGate

Google/Яндекс/другие поисковые системы общего назначения склонны искать картинки котиков, подсовывать рекламу товаров и не очень подходят для поиска научной информации. Для последней есть хорошее средство: https://scholar.google.ru/. Найденные ссылки Академия умеет оформлять по ГОСТу. 
Копируйте и вставляйте в свою библиографию. Справа даётся ссылка на оригинальный документ, если он в публичном доступе, скажем, в социальной сети учёных, ResearchGate.
Социальная сеть ResearchGate позволяет отслеживать новые публикации от учёных, которых вы считаете передовыми в своей области. Кроме того, там можно задать вопрос и получить консультацию. 
Связка Google Академия + ResearchGate способна обеспечить учёному широкое распространение его результатов: ResearchGate хранит статью, а Академия её найдет. К сожалению, всё еще присутствует промежуточная инстанция — публикация в рецензируемом журнале. Препятствий к тому чтобы выложить свои результаты на суд публики без посредства журнала нет, однако, алгоритм Google Академия устроен так, что в первую очередь он выдаёт статьи с максимальным цитированием. У собственных результатов, опубликованных "как есть" в ResearchGate нет индекса цитирования.

Архивы препринтов

Наиболее востребованной функцией соцсети оказывается хранение данных: Вконтакте содержит много фильмов и музыки, а ResearchGate вбирает в себя статьи. Математики и физики уже давно осознали потребность в обмене и хранении результатов, без лишних функций вроде новостей и бесед. У них есть arXiv.org - крупнейший бесплатный архив электронных публикаций научных статей и их препринтов по физике, математике, астрономии, информатике и биологии.
Препринты это те же самые статьи, посвящённые какой-либо теме, с которой автор хочет ознакомить заинтересованных лиц и специалистов (для обсуждения и/или уточнения полученных результатов работы), выпускаемые в свет до публикации статей в рецензируемых научных журналах. Ну а зачастую и вместо, чтобы не заморачиваться с рецензированием.
Редколлегии журналов хотят только яркие результаты от популярных деятелей. Рецензенты ревностно следят за вашими успехами и готовы буквально кровь выпить за каждую неточность или помарку в публикации. Статьи в журналах стоят больших денег или требуют дорогостоящей подписки, выходят в печать не спеша. Каждый ученый, что публиковался когда-либо, знает об этих препонах. Особенно неприятна ситуация, когда в процессе долгого рецензирования и внесения правок узнаешь, что конкуренты уже вышли со своей статьей. Попробуй докажи теперь свой приоритет! Препринт, в первую очередь, это гарантия приоритета ученого.
На заметку: доказательства знаменитой задачи тысячелетия "гипотезы Пуанкаре" математик Григорий Перельман опубликовал в архиве препринтов. См. Perelman, Grisha (November 11, 2002), "The entropy formula for the Ricci flow and its geometric applications", arΧiv:math.DG/0211159
Пожалуй, только благодаря этому мудрому решению мы знаем о Григории Перельмане. Только на проверку его доказательства были выделенны миллионные гранты, а уж соблазн именитому рецензенту прихватить результаты и выдать за свои в случае проблемы тысячелетия и вовсе не преодолим. Так, китайские математики, Чжу Сипин и Цао Хуайдун вместе со своим учителем Яу Шинтуном (лауреат Филдсовской премии 1982 года) предприняли попытку плагиата, заявив, что они нашли «полное доказательство». Еще и адвокатов наняли.
Как мы видим, ссылка на Перельмана стала классикой. Однако, что это такое вместо номера журнала и страниц? arΧiv:math.DG/0211159

Идентификатор цифрового объекта: DOI

Файлам страницы и номера с названием журнала не нужны. Публикация это файл. В arXiv.org публикации кодируют так: math.DG/0211159, а в наиболее общем случае, используется схожая система - DOI, или  Digital Identifier of an Object. Знание DOI позволяет найти интересующую статью, где бы она не находилась. Каждая вышедшая в журнале публикация имеет DOI. В практическом смысле, забудьте название, авторов, год и номер - это неважно, до тех пор, пока есть DOI.
Например, мы почитали статью иммуноферментный анализ в Википедии, определили, что зачем-то нужна пероксидаза хрена и что английская аббревиатура метода - ELISA. Нам интересны медицинские приложения, и поисковая база данных медицинских публикаций PubMed для этих целей подходит лучше Google Академии. Вперёд!

Ого, кажется, что-то интересное. Первая ссылка в выдаче, ИФА для определения вируса гепатита. Берём его doi: 10.4110/in.2017.17.6.451, формируем адрес в браузере http://dx.doi.org/10.4110/in.2017.17.6.451, ввод и мы на странице журнала с этой статьей. 
Всё на самом деле просто - так оно и работает.

Скачиваем статьи: Sci-Hub

В подавляющем большинстве случаев жадные капиталисты не дадут скачать статью просто так, бесплатно. Наивным людям также следует знать, что эти деньги ученым не попадут никак: ученые сами пишут статьи, сами их оформляют согласно правилам журнала, сами рецензируют друг друга и ничего за это не получают. Несправедливо? Если Ваш ответ - да, и Вы готовы действовать, для Вас сервис Sci-Hub. Вводим DOI - скачиваем статью. Из-за постоянных войн с издательствами, сайт Sci-Hub меняет адрес, иногда не работает... Лично мне больше нравится Telegram-бот Sci-Hub. На моей памяти он работал всегда.
Из картинки ясно, как что делать.

Мой порядковый номер...

В эпоху Больших Данных идентификаторы есть не только у статей, но и у их авторов. Согласитесь, если нужного автора зовут Иванов И.И., или просто Ши Ю - искать среди всех в мире с такими именами будет сложно. Если Ваш случай, знайте, Вам нужен ORCID - ORCID (Open Researcher and Contributor ID). Подписывайте статьи им и Вас не перепутают.

Искренне Ваш,

понедельник, 25 декабря 2017 г.

Работа с документами MS Office в Linux

Офисный пакет приложений Microsoft Office всегда доставлял немало проблем пользователям Linux. Чем открывать DOC-файлы, как сохранять файлы так, чтобы коллеги потом открывали их у себя в уютной Windows, казалось этот вопрос на десятилетия.
StarOffice развился в OpenOffice, потом появился LibreOffice, взята новая планка, но... о точном соответствии речи всё еще не было. Наконец, свершилось!

Этот день настал: мы открыли исходный код десктопных редакторов ONLYOFFICE. Теперь они абсолютно бесплатны для домашнего и коммерческого использования.

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


воскресенье, 24 декабря 2017 г.

Рабочий стол - FVWM

Первая разновидность - интерфейс для вновь устроенных на работу, призванный облегчить привыкание новичка за счёт чувства знакомства. "О, я знаком с Windows 7, вот кнопка Пуск, нажать её, дальше увидим". Глаз привычно ищёт меню приложений Пуск в левом нижнем угле, окна закрываются пиктограммой крестик и т.п. Настройка призвана быть стандартной и ни в коем случае не должна привести к нарушению привычного вида.
Второй тип - это то, что нужно только Вам и вас не волнует, что подумают другие, о том, что кнопку Пуск Вы убрали куда-то, обои не меняются правым кликом мыши и тому подобное. Вы хотите эти кнопки, значки и меню так, как удобно только Вам. Как что выглядит и располагается - Ваше дело, а не компании Microsoft или сообщества разработчиков KDE или Gnome. Эффекты? Можно приделать, но зачем? Зачем кнопке запуска пылесоса (а компьютер это тоже по своей сути бытовая техника) свечение плазмы и победный звук? Только отвлекает.

Для тех единоличников, кто любит простоту и эффективность - рабочий стол FVWM. В том виде, как он есть у меня сейчас, в 2017 году, он был и 20 лет назад. Изменился самую малость. Вот он!

Слева расположился ряд свернутых окон. Каждое хранит свой снимок - удобно, чтобы вспомнить, на чём остановился. Меню Start вызывается кликом правой кнопки мыши, содержит список программ, которыми я пользуюсь. Значки, порядок в списке - то, как удобно мне. Окно Терминала и в правом нижнем уголке переключатель виртуальных рабочих столов (умножает пространство в 9 раз) и часы.
Кстати, всё управление дублируется с клавиатуры - иногда это удобнее, чем перемещать мышь.

Возможно, лучший способ понять принципы настройки fvwm - думать о нём как о специализированном языке программирования высокого уровня.

Как любой язык программирования, fvwm предоставляет пользователю команды для управления окнами и элементами интерфейса, управляющие структуры и возможность написания собственных функций. Существует несколько библиотек - модулей. Команды и функции привязываются к различным событиям от устройств ввода - клавиатуры и мыши. Полное описание всех команд и функций занимает около двухсот страниц, но один конфигурационный файл пользователя совсем небольшой.

Да, следуйте простым инструкциям и воплощайте свою концепцию интерфейса. Меня вдохновляла книга Джефа Раскина, Интерфейс: новые направления в проектировании компьютерных систем. — Пер. с англ. — СПб: Символ-Плюс, 2004, однако, сколько людей, столько и мнений. Вы можете ознакомиться с ними здесь.

Вот пример, как реализованы эскизы свернутых окон на fvwm. При свертывании окна вызывается пользовательская функция Thumbnail, она передаёт id окна программе xwd, та делает её снимок, затем передаёт его по конвееру программе convert, где снимок уменьшается и преобразуется во временный png-файл. Свернутой программе назначается новая иконка, с изображением из этого png-файла. Всё на самом деле просто.
DestroyFunc Thumbnail
AddToFunc Thumbnail
+ I Raise
+ I ThisWindow (!Shaded, Iconifiable, !Iconic) PipeRead \
    "xwd -silent -id $[w.id] | convert -scale 256 -frame 1x1 \
     -mattecolor black -quality 0 xwd:- png: $[FVWM_USERDIR]/tmp/icon.tmp.$[w.id].png; sleep .1 \
     && echo WindowStyle IconOverride, \
     Icon $[FVWM_USERDIR]/tmp/icon.tmp.$[w.id].png \
     || echo Nop"
+ I Iconify

DestroyFunc DeThumbnail
AddToFunc DeThumbnail
+ I Exec rm -f $[FVWM_USERDIR]/tmp/icon.tmp.$[w.id].png
+ I DestroyWindowStyle

*FvwmEvent: deiconify DeThumbnail

AddToFunc StartFunction I Test (Restart) All (Iconic) \
  Test (f $[FVWM_USERDIR]/tmp/icon.tmp.$[w.id].png) WindowStyle \
  IconOverride, Icon $[FVWM_USERDIR]/tmp/icon.tmp.$[w.id].png
Код добавляется в Ваш личный config-файл и fvwm становится таким, как Вы пожелали. Удачи!

суббота, 23 декабря 2017 г.

Рецепт создания djvu-книжки

Мне в руки попала книжка, взята по МБА, её потребуется скоро вернуть, а хочется оставить себе, вечерами читать, например. В сети не нашёл, книга редкая. Решил сделать её djvu-вариант, делюсь с вами рецептом.
Нам понадобится:
  1. Linux (у меня Linux Mint — дистрибутив, основанный на Ubuntu и Debian)
  2. Программы сканирования, обработки и конвертации изображений в книгу djvu: pdfimages (из библиотеки Poppler), convert (набор утилит ImageMagic для пакетной обработки изображений), cjb2 и djvm (DjVuLibre — набор библиотек и утилит для просмотра, создания и редактирования DjVu-файлов)
  3. Следовать простым инструкциям, предоставленным здесь

Рецепт

Установим программы, если их нет:
sudo apt-get install simple-scan poppler-utils imagemagick djvulibre-bin
Сканируем книгу в файл pdf:
Пару проб сканов для подбора параметров: контраст, яркость. Разрешение 600 DPI для книги (режим сканирования: Text) достаточно.
Создаём пустую папку, кладём туда файл с отсканированной книгой book.pdf.
Открываем терминал, заходим в директорию с book.pdf, выполняем следующие команды:
pdfimages book.pdf page
for file in *.ppm; do convert -rotate 90 -resize 50% $file ${file%.*}.pbm; done
for file in *.pbm; do cjb2 -clean $file ${file%.*}.djvu; done
djvm -c book.djvu *.djvu
  1. pdfimages разобьёт pdf-файл по страницам page-001.ppm, page-002.ppm и т.д;
  2. строка с convert -rotate 90 -resize 50% обработает все сканы страниц, повернёт, уменьшит и подготовит набор страниц в формате *.pbm. Все обработки изображений делаются здесь, программой convert, она ещё много чего умеет;
  3. строка с cjb2 -clean конвертирует сканы в djvu-страницы;
  4. наконец, djvm -c book.djvu *.djvu соберёт готовую книгу.
Смотри также Создание документов DJVU в Linux за подробностями и тонкостями процесса.