Разработка

Реализация собственного SDK

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

(далее…)

Микроконтроллеры и электроника

Устраняем программно дребезг кнопок и переключателей

Кнопки и прочие переключатели — являются неотъемлемой частью, практически любого устройства. Однако, реализация этих устройств приводит к такому нежелательному явлению для микроконтроллерной техники, как дребезг контактов. Что такое дребезг? Давайте разбираться!

(далее…)

Полезное

Численные методы решения уравнений в среде MatLab

Доброго времени суток! В этом посте я расскажу о численных методах решения уравнений, что очень удобно для их расчёта на компьютере. Приведу 3 вида и 3 примера кода, для каждого вида соответственно, а также расскажу о предостерегающих трудностях и путях их решения.

Иногда нам приходится решать уравнения, кому-то по работе, а кому-то понадобилась для домашних нужд — назовём это так. В школе нас учили, что для решения уравнения, необходимо выразить искомую переменную и тогда мы получим символьное решение уравнения, а если вместо букв поставить числа, то получим численное решение того или иного уравнения. Однако, бывают такие уравнения, в которых нельзя явно выразить искомую переменную, например, уравнение ниже.

Доброго времени суток! В этом посте я расскажу о численных методах решения уравнений, что очень удобно для их расчёта на компьютере. Приведу 3 вида и 3 примера кода, для каждого вида соответственно, а также расскажу о предостерегающих трудностях и путях их решения.

Иногда нам приходится решать уравнения, кому-то по работе, а кому-то понадобилась для домашних нужд — назовём это так. В школе нас учили, что для решения уравнения, необходимо выразить искомую переменную и тогда мы получим символьное решение уравнения, а если вместо букв поставить числа, то получим численное решение того или иного уравнения. Однако, бывают такие уравнения, в которых нельзя явно выразить искомую переменную, например, уравнение ниже.

sin(x)tg(x)ln(x)=4

 Решать такие уравнения приходиться численно, то есть получая ответ в виде числа, а если вам нужна зависимость, то придётся задать диапазон начальных условий и получить, соответственно, диапазон значений искомого параметра.  Предлагаю вам ознакомиться с моей презентацией, а после чего прочитать комментарии и пояснения к ней ниже. Также, в конце записи я опубликовал листинги программ для расчёта указанными методами в среде MatLab.

При решении уравнений 2 или 3 типа, может возникнуть ситуация , когда из большого шага между двумя значениями x и(или) y, мы можем не достичь требуемой точности и тогда результат будет не предсказуем. Для избежания таких случаев предлагаю использовать не сравнение результата с заданным уровнем точности, а сравнение точностей для каждого значения переменной и выбор значения с наибольшей точностью. Подробнее  расскажу на примере кода. Рекомендую использовать следующей алгоритм действий для уравнений типа f(x)=const:

  1. разбиваете заданный диапазон значений на n равных интервалов и получаете n+1 значений x
  2. решаете уравнение для каждого значения х
  3. выбираете то значение хi, при котором точность максимальна.
  4. из п. 3 следует, что точное решение находится между хi-1 и хi+1. Устанавливаете новый диапазон значений для x от хi-1 до хi+1 , сохраняя то же число интервалов.
  5. Вновь расчитываете уравнение для нового интервала с новым шагом
  6. Повторяете указанные действия до тех пор, пока интервал значений х не будет достаточно мал, чтобы получить требуемую точность вычислений.

Аналогичный алгоритм, лишь с некоторым поправками, можно использовать и для решения уравнений вида f(x,y)=y.

Листинг программы для решения уравнений вида f(x)=x в среде MatLab

Если кому интересно, то ниже производится решение следующего уравнения относительно γ.
dispersionnoe_sootnoshenie
[code lang=»matlab» collapse=»false»]% Задаём исходные данные
lamda=632.8*10^-9; % Длина волны излучения
k0=2*pi/lamda; % Расчитвыаем волновое число
d2=1*10^-6; % Толщина волноводного слоя
n1=1.335; % Показатель преломления чистого полимера
n2=1.7476; % Показатель преломления подложки CTK19
n3=1; % Показатель преломления среды — воздух

eps=10^-6; % Задаём точность
gamma_cp=1.3; % Задаём приближённое значение
razn=1; % Задаём начальное значение разности x(i+1)-x(i). Значение должно быть заведомо больше eps.
i=0; % Зададим начальное значение счётчика итераций.
% Зададим уравнение как функцию g(d2,gamma_cp,k0,n1,n2,n3), где все аргументы, кроме gamma_cp являются константами, т.е. по сути g(gamma_cp)=gammka_cp.
g=inline(‘sqrt(n2^2-((atan(sqrt((gamma_m^2-n1^2)/(n2^2-gamma_m^2)))+atan(sqrt((gamma_m^2-n3^2)/(n2^2-gamma_m^2))))/(k0*d2))^2)’);
// начинаем циклический подсчёт
while(razn>eps) { % выполняем цикл пока не достигнем требуемой точности
i=i+1; % увеличиваем на единицу количество выполненых итераций
gamma_temp=g(d2,gamma_cp,k0,n1,n2,n3); % расчитываем итерацию
razn=abs(gamma_temp-gamma_cp); % расчитываем погрешность
gamma_cp=gamma_temp; % Устанавливаем результат данной итерации как приближённое значение искомой переменной gamma_cp
}
gamma_cp % Выводим на экран результат вычислений
i % Выводим на экран количество пройденых итераций
[/code]

Листинг программы для решения уравнений вида f(x,y)=y в среде MatLab

Этот код решает следующее уравнение относительно θ. eff_refractive_index
[code lang=»matlab»]
gamma=[1:0.0001:1.33]; % Задаём диапазон значений гаммы
for i=[1:length(gamma)] % Выполняем тело цикла для каждого значения гаммы от первого до последнего
% Задаём вспомогательные и служебные переменные
razn=100;
tetz=0;
raz=100;
run=1;
teta_n=61.6*pi/180; % Задаём начальное значение угла (определено приближениями)
% Высчитываем значение с точностью до 1/10 угловой секунды
while(run)
teta_n=teta_n+pi/(180*60*60*10);
razn=abs(gamma(i)-np*sin(beta+asin(sin(teta_n)/np)));
% Если текущее значение имеет более высокую точность, чем предыдущее, то записываем это значение и его погрешность.
if razn<raz
tetz=teta_n;
raz=razn;
end
% Прерываем расчёт при угле больше 61,7 градусов, т.к. за пределами указанного диапазона (61.6-61.7) решений нет
if teta_n>=(61.7*pi/180)
run=0;
end
end
teta_m(i)=tetz*180/pi; % Переводим результат в градусы и записываем в массив ответов
end
[/code]
На выходе данной программы получаем массив значений угла θ. Границы диапазона θ от 61.7 до 61.8 найдены путём последовательных приближений. Сначала уравнение решалось для всех гамма в пределах угла от 1 до 90 с шагом в 1 градус, затем диапазон сужался по тому же принципу, что и в случае с предыдущем кодом, и действия повторялись до достижения требуемой точности.

Если у вас есть какие-либо вопросы, замечания или предложения, то их в комментариях к данному посту! Удачных вам математических расчётов! До скорых встреч!

Разработка

Проверяем наличие подключения к сети в Android

Доброго времени суток, уважаемые посетители и постоянные читатели! Этот пост я посвящу разработке приложений под Android и он будет первым постом в серии записей на эту тему. Начался учебный год, снова в универ, теперь свободного времени будет гораздо меньше, поэтому, мною было приятно решение, писать в блог не только большие информативные посты, но и небольшие заметки-подсказки по интересным мне темам. Примером такой записи и будет эта статья.

Существует лишь малая часть, скорее даже бесконечно малая  часть, android приложений, которые не используют возможности сети и связь с «внешним миром» в своей работе. Даже самые простые игрули используют сеть для отправки данныъ, например, для создания таблицы рекордов или банально для загрузки рекламы, отображаемой в приложении. Поэтому, практически каждый разработчик сталкивался с необходимостью проверки наличия подключения к сети, поскольку её отсутствие может вызывать фатальные ошибки приложения, пытающегося загрузить или отправить какие-либо данные. Проверить наличие подключения к сети очень легко, но надо понимать, что подключение к сети может быть активно, но самого Интернета может и не быть — тут, разве что, только отлавливать эксцепшены и не давать им «рушить» всё приложение.

Я проверяю подключение следующей функцией

public Boolean internetAvailable() {
		ConnectivityManager connectManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		boolean internetAvailable = (connectManager.getNetworkInfo(
				ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || connectManager
				.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED);
		return internetAvailable;
	}

Эта функция очень удобна в использовании, поскольку она возвращает значение логического типа, что позволяет Вам делать следующие, лёгкие в понимании, конструкции вида:

if(internetAvailable()) {
...
Интернет есть
...
} else {
...
Интернета нет
...
}

Использование таких конструкций при написании кода — делает его гораздо более удобным для восприятия человеку. Таким образом, Ваш код легче читается и понимается другими людьми.

Пишите хороший код, удачи!

Новости

index.php

<?php
date_default_timezone_set(«Europe/Moscow»);
$yesterday=date(«z»);
if($yesterday == «255») echo «<h1>С Днём Программиста!</h1>
<p>Поздравляю всех программистов, от любителей до профессионалов, с профессональным праздником. Желаю чистого и рабочего кода.</p>»;
?>

PHP

PHP: пропорциональное уменьшение изображения

Фух. Наконец-то появилось свободное время — завершил все заказы по верстке, написал с нуля небольшой веб сервис (о нём я расскажу позже. В конце августа или в начале сентября), а теперь напишу небольшой урок по php. Хотя в дальнейшем я буду публиковать новые уроки по программированию. Буду рассматривать свои «старые» скрипты, а также делиться опытом в «прямом эфире» — т.е. научился чему-либо, попробую научить и вас.

Сегодня я разберу скрипт своего старого музыкального портала, который я написал в далёком 2005 году, когда ещё никто и не мечтал о верстке дивами и все верстали таблицами. =) Тогда наверно и не существовало html-верстальщиков — ибо один человек мог написать с нуля статическую домашнюю страничку и гордиться этим. Следовательно, мой сайт был сверстан таблицами и у меня появилась проблема. Поскольку любой пользователь мог добавить в галерею сайта фотографии, то фотографий в галерее было много и они были разного размера, но фотогалерея сайта была задумана так, чтобы фотографии размещались по 4 штуки на строку и было 5 строк на странице. Естественно, в полный размер фото бы не уместились и появился бы горизонтальный скролл. Тогда я решил написать скрипт, который при загрузке фото на сервер, создавал бы уменьшенную копию фотографии с шириной 150 пикселей, не теряя при этом пропорций фотографии. Забыл сказать, данный скрипт расчитан на jpg изображения т.к. подавляющее большинство фотографий делаются в этом формате.

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

<?php
//Определяем размер фотографии — ширину и высоту
$size=GetImageSize ("photo.jpg");
//Создаём новое изображение из «старого»
$src=ImageCreateFromJPEG ("photo.jpg");
//Берём числовое значение ширины фотографии, которое мы получили в первой строке и записываем это число в переменную
$iw=$size[0];
//Проделываем ту же операцию, что и в предыдущей строке, но только уже с высотой.
$ih=$size[1];
//Ширину фотографии делим на 150 т.к. на выходе мы хотим получить фото шириной в 150 пикселей. В результате получаем коэфициент соотношения ширины оригинала с будущей превьюшкой.
$koe=$iw/150;
//Делим высоту изображения на коэфициент, полученный в предыдущей строке, и округляем число до целого в большую сторону — в результате получаем высоту нового изображения.
$new_h=ceil ($ih/$koe);
//Создаём пустое изображение шириной в 150 пикселей и высотой, которую мы вычислили в предыдущей строке.
$dst=ImageCreateTrueColor (150, $new_h);
//Данная функция копирует прямоугольную часть изображения в другое изображение, плавно интерполируя пикселные значения таким образом, что, в частности, уменьшение размера изображения сохранит его чёткость и яркость.
ImageCopyResampled ($dst, $src, 0, 0, 0, 0, 150, $new_h, $iw, $ih);
//Сохраняем полученное изображение в формате JPG
ImageJPEG ($dst, "small_photo.jpg", 100);
imagedestroy($src);
?>

Пример работы скрипта вы можете посмотреть здесь. Исходное изображение находится тут. Если хотите, то можете уменьшить любое другое изображение. Для этого передайте скрипту адрес изображения в виде http://www.zhitenev.ru/demo/img-resize/?photo=http://site.ru/1.jpg, где «http://site.ru/1.jpg» — путь к изображению.

Вот и всё. Для решения задачи нам потребовалось всего лишь 9 строк кода. Удачного вам кодинга и работающего кода. До следующего поста!