Разработка и реализация алгоритмов обработки данных, получаемых с помощью сканирующих нанотвердомеров семейства НаноСкан

Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования

НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ЯДЕРНЫЙ УНИВЕРСИТЕТ “МИФИ”

ФАКУЛЬТЕТ “АВТОМАТИКА и ЭЛЕКТРОНИКА”

Кафедра “Электронные измерительные системы”

ОТЧЕТ ПО ПРОИЗВОДСТВЕННОЙ ПРАКТИКЕ

на тему Разработка и реализация алгоритмов обработки данных, получаемых с помощью сканирующих нанотвердомеров семейства НаноСкан_

Студент гр. А11-08 ___________ Русаков А.А.

(подпись) (ФИО)

Руководитель практики _________ Усеинов А.С.

(подпись) (ФИО)

зав. лаб. сканирующей зондовой микроскопии, к.ф.-м.н.

(должность, ученая степень и звание)


Москва 2011 г.

Содержание

Введение

1 Обзор и анализ структуры программного обеспечения сканирующих нанотвердомеров семейства НаноСкан

1.1 Организация структуры программного обеспечения

1.2 Пользовательский интерфейс программы NanoScan Viewer

1.3 Организация программного кода программы NanoScan Viewer

2 Разработка алгоритмов пакетной обработки результатов измерения твердости методом индентирования

2.1 Метод индентирования

2.2 Реализация метода индентирования в «НаноСкан-3Д»

2.3 Разработка алгоритма автоматического определения точки контакта

3 Экспериментальные результаты: апробация разработанного алгоритма на примере серии измерений твердости образца твердого сплава на основе кубического нитрида бора

3.1 Апробация алгоритма

3.2 Границы применимости алгоритма

Заключение

Приложение 1. Алгоритм метода наименьших квадратов

Приложение 2. Листинг программы на С++ автоматического определения точки касания.

Введение

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

Сканирующий зондовый микроскоп (в варианте «скариующий туннельный микроскоп») был изобретён Гердом Биннигом и Генрихом Рорером в 1981 году, за что они были награждены Нобелевской премией по физике (1986).

Сканирующая зондовая микроскопия помогает не только различать положения отдельных атомов, но и перемещать их на нужные места, хотя долгое время это считалось невозможным. Также она кардинально расширила исследовательские возможности учёных, позволив заняться исследованием поведения атомов на границе раздела двух сред.

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

Созданием сканирующих зондовых микроскопов и проведением исследований с их помощью заняты множество научных организаций в России и зарубежом, например, «JEOL» (Япония), «Микротестмашины» (Беларусь), ЗАО «Нанотехнология МДТ» (Россия), ООО НПП «Центр перспективных технологий» (Россия), АНО «Институт нанотехнологий МФК» (Россия), ФГБНУ ТИСНУМ (Россия).

Сканирующие нанотвердометры семейства «НаноСкан» разработаны в ФГБНУ ТИСНУМ и являются высокоточными приборами, предназначенными для измерения физико-механических свойств материалов, таких как рельеф поверхности, карта распределения механических неоднородностей, твердость, модуль упругости (Юнга), износостойкость и ряд других характеристик.

1 Обзор и анализ структуры программного обеспечения сканирующих нанотвердомеров семейства НаноСкан

1.1 Организация структуры программного обеспечения

В комплекте с нанотвердометрами семейства «НаноСкан» поставляется оригинальное программное обеспечение, разработанное специально для этих нанотвердометров. Структура программного обеспечения приборов включает две основные программы (NanoScan Device и NanoScan Viewer), а также ряд вспомогательных утилит. Две основные программы работают независимо, однако реализован механизм, позволяющий данным программам обмениваться данными в режиме реального времени, используя буферизацию в оперативной памяти персонального компьютера.

Программа NanoScan Device предназначена непосредственно для управления работой прибора, запуска измерений и сбора данных. С помощью неё задаются необходимые параметры эксперимента, осуществляется контроль над ходом эксперимента, выполняются калибровочные и настроечные процедуры. В ходе проведения измерений NanoScan Device управляет оборудованием и пересылает данные в программу NanoScan Viewer при помощи технологии Memory Mapping. Другими словами, в памяти компьютера создаётся выделенная область, к которой может иметь доступ не только та программа, которая эту область создала, но и любая другая, которая знает дескриптор области или название области. В эту область NanoScan Device записывает все измеренные величины.

Программа NanoScan Viewer предназначена для сохранения, загрузки, просмотра и обработки результатов измерений, полученных при помощи NanoScan Device. Используются собственные форматы файлов, позволяющие хранить как одномерные результаты измерений (например, кривые нагружения), так и двухмерные/трёхмерные результаты измерений (карты высот). В программе широко представлены возможности обработки полученных данных, включая разнообразную фильтрацию, аппроксимацию, простые алгебраические преобразования графиков, построение гистограмм высот и т.д.

Задачи, решаемые в рамках прохождения преддипломной практики, были связаны с программой NanoScan Viewer, поэтому рассмотрим её подробнее.

1.2 Пользовательский интерфейс программы NanoScan Viewer

Программа является многодокументным приложением (MDI), которое может открывать документы двух основных категорий — двухмерные/трёхмерные (рельеф поверхности) и одномерные (графики, диаграммы). В открытых одномерных документах, кроме непосредственно обработки можно изменять масштаб отображения, цвет и толщину линий, названия графиков и линий. В двухмерных/трёхмерных документах можно, кроме обработки результатов, переключаться между трёхмерным и двухмерным представлением (в трёхмерном представлении можно произвольно вращать изображение с помощью манипулятора мыши), менять цветовую палитру отображения и т.д. Главное окно программы (см. рисунок 1) снабжено главным меню и панелью инструментов.

Рисунок 1. Общий вид окна программы NanoScan Viewer с открытыми документами.

Также панелью инструментов снабжён каждый открытый документ, содержащий одномерные графики. Меню и панели инструментов главного окна меняются в зависимости от типа активного открытого документа. Для обработки результатов существуют специальные диалоговые окна, например, Graph Manager «Диспетчер графиков» (см. рисунок 2) и окно Nanoindentation «Наноиндентирование» (см. рисунок 3), они имеют собственные меню команд.

Рисунок 2. Вид окна Graph Manager

Рисунок 3. Вид окна Nanoindentation.

1.3 Организация программного кода программы NanoScan Viewer

Программа написана на языке C++ с использованием библиотеки MFC (Microsoft Foundation Classes) и парадигмы объектно-ориентированного программирования. Парадигма объектно-ориентированного программирования состоит в том, что всё содержимое программы разбивается на некоторое количество объектов, при этом каждому объекту присваивается какой-либо класс. Каждому классу объектов соответствуют некоторые свойства (переменные класса) и методы (функции класса).

Исходный текст программы состоит из большого числа (более двух сотен на текущий момент) файлов, имеющих характерные для С++ расширения *.h (заголовочные файлы) и *.cpp (файлы с исходным кодом). Заголовочные файлы содержат в себе объявление какого-либо класса, а файл с исходным кодом содержит в себе описание методов этого класса. Таким образом, на каждый класс, содержащийся в программе, выделяется по два файла. Есть файлы и не относящиеся к какому-либо классу — например, это заголовочный файл, содержащий объявление глобальных констант. Кроме заголовочных файлов и файлов с исходным кодом присутствует двоичные файлы ресурсов (графические иконки, например) и файл-описатель ресурсов (NSCtrl.rc, создаётся и дополняется автоматически).

Сама программа выполнена как многодокументное приложение (MDI) в концепции фрейм-представление-документ (Frame-View-Document). Данная концепция призвана разделить данные документа и их отображение. Это означает, что на каждый тип отображаемых документов должно быть создано по три класса — класс самого документа содержит в себе данные, класс представления управляет способом отображения данных документа, а класс фрейма управляет самим окном с документом. У одного документа может быть несколько представлений. Применительно к NanoScan Viewer два представления имеют место при отображении двухмерных/трёхмерных документов: на двухмерное и трёхмерное представление выделено по одному классу представлений. В двухмерном представлении мы видим изображение поверхности, на котором цвет участка определяет его высоту, в трёхмерном же можно видеть непосредственно рельеф поверхности и поворачивать его произвольным образом. Одновременно в данном случае можно наблюдать только одно из них (см. рисунок 4).

а б

Рисунок 4. Двухмерное (а) и трёхмерное (б) представление документа

Классы, выходящие в состав исходного текста программы (всего их более сотни), могут быть разделены на следующие группы:

  • Главный класс приложения

  • Классы документов в рамках концепции фрейм-представление-документ

  • Классы диалоговых окон

  • Классы нестандартных элементов управления интерфейса (таких, как таблица)

  • Класс математического обеспечения

  • Другие вспомогательные классы (обслуживание графических файлов, работа с OpenGL, INI-файлами и др.)

В соответствии с концепцией библиотеки MFC программа является также событийно-ориентированной и завязанной, в основном, на действия пользователя. Когда пользователь выбирает тот или иной пункт меню, нажимает на кнопку, щёлкает по рабочей области окна или производит какие-либо другие действия над интерфейсом, вызывается обработчик события, если он есть. Например, пользователь совершает протягивание мышкой в области двухмерного/трёхмерного документа, когда тот находится в двухмерном представлении и активен режим Height Histogram, позволяющий получать функцию площади. В результате этого вызывается обработчик, рисующий красную рамку выделения и отображающий текущие размеры выделения в пикселях и в микрометрах — ширину и высоту (см. рисунок 5).

Рисунок 5. Пример действия вызванного обработчика

2 Разработка алгоритмов пакетной обработки результатов измерения твердости методом индентирования

2.1 Метод индентирования

Одной из основных задач приборов семейства «НаноСкан» является выполнение измерений механических свойств материалов, в первую очередь твердости и модуля упругости (Юнга), на субмикронном и нанометровом масштабе линейных размеров.

На сегодняшний день наиболее распространенным методом измерения механических свойств материалов на наномасштабе является метод наноиндентирования. Изначально эта методика была предложена Булычевым и Алехиным в 70-е годы прошлого века, а затем оптимизирована для наноизмерений Оливером и Фаром в 1992 году. Метод наноиндентирования заключается в следующем: твердая игла известной формы вдавливается в поверхность образца с постоянной скоростью. При достижении заданной нагрузки или глубины вдавливания игла отводится в обратном направлении. В процессе нагружения производится запись значений нагрузки и соответствующего ей смещения иглы. Результирующая зависимость называется кривой нагружения–внедрения (см. рисунок 6).

Рисунок 6. Схематическое изображение диаграмм напряжение–деформация, кривых нагрузка – смещение и рельефа поверхности при максимальной нагрузке (сплошные линии) и при полной разгрузке (пунктирные линии) для абсолютно упругих, идеально пластичных и вязкопластичных материалов

Часть кривой, соответствующая нагружению, характеризует сопротивление материала проникновению иглы и отражает как упругие, так и вязкие свойства исследуемого материала. Форма части кривой, соответствующей разгрузке, в основном определяется упругим восстановлением материала.

Используя выбранную теоретическую модель, по данной экспериментальной кривой можно определить твердость и модуль упругости материала. Для анализа кривых могут использоваться разные подходы. В части работ разделяют упругую и вязкую составляющие и определяют твердость и модуль упругости по кривой нагружения. В других для характеристики механических свойствах образца используют величину работы, затраченной на создание отпечатка, и работы, высвобождаемой при разгружении, определяемую по площади под соответствующим участком кривой. Однако в большинстве случаев для анализа кривых нагружение –внедрение используется участок кривой, соответствующий разгружению. Наиболее распространенным является метод, предложенный Оливером и Фарром (см. рисунок 7).

а) б)

Рисунок 7. Общий вид кривой нагружения (а) и схема контакта индентора с поверхностью (б)

В рамках данного метода твердость H образца определяется уравнением

( 1 )

Здесь Ас – площадь проекции отпечатка при максимальном значении приложенной нагрузки Pmax (рис. 1б).

Значение эффективного модуля упругости

( 2 )

Константа зависит от формы индентора. В наноиндентировании чаще всего применяется трехгранная пирамида Берковича. Для индентора Берковича с углом при вершине 142º = 1.034. Жесткость контакта S определяется следующим образом. Начальная часть кривой разгружения аппроксимируется следующей функцией:

( 3 )

Здесь hf – глубина остаточного отпечатка, а  и m – параметры аппроксимации; полученная зависимость дифференцируется аналитически для определения угла наклона кривой разгружения в точке Pmax:

( 4 )

Наибольшая глубина внедрения индентора в поверхность hc вычисляется по формуле:

( 5 )

Константа  зависит от геометрии индентора ( ~0.75 для пирамиды Берковича), hi – расстояние, соответствующее пересечению касательной c кривой разгружения в начальной части с осью внедрения (см. рисунок 7а).

Площадь контакта при максимальной нагрузке Ас определяется геометрией индентора и глубиной контакта hc и описывается так называемой функций формы иглы . Если форма индентора предполагается идеальной (это справедливо для индентирования на большую глубину), то зависимость площади Ас от глубины hc определяется из геометрии индентора , например, для индентора Берковича .

Остаточная глубина погружения вычисляется по формуле:

( 6 )

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


Рисунок 8. Пример серии кривых нагружения–внедрения, полученных при индентировании плавленого кварца с различными нагрузками на сканирующем нанотвердомере «НаноСкан-3Д»

2.2 Реализация метода индентирования в «НаноСкан-3Д»

Описанный метод реализован в сканирующем нанотвердомере «НаноСкан-3Д». При проведении измерений на данном приборе одновременно снимаются две зависимости: нагрузка от времени и перемещение индентора от времени (см. рисунок 9).

Рисунок 9. Исходная диаграмма индентирования, получаемая с прибора. Верхний график: зависимость нагрузки от времени, нижний график: зависимость перемещения индентора от времени.

Процесс измерения состоит из нескольких фаз (см. рисунок 9): приближение к поверхности (1), точка контакта (2), нагружение (3), релаксация (4), снятие нагрузки (5), измерение термодрейфа (6), окончательная разгрузка и отвод (7). Разбиение графиков зависимостей на стадии является очень важным для получения правильных результатов. Особо важным является определение точки контакта, так как границы остальных фаз фактически известны заранее — смена фазы происходит одновременно с изменением режима работы аппаратуры (например, переход из фазы 3 в фазу 4 происходит, когда аппаратура останавливает индентор). Точка контакта же не может быть определена подобным образом. При небольшом объёме измерений точка контакта может легко быть определена визуально, однако в случае большого числа измерений визуальное (ручное) определение точки контакта начинает существенно замедлять обработку результатов измерения. Таким образом, возникает необходимость разработки алгоритма автоматического определения точки контакта.

2.3 Разработка алгоритма автоматического определения точки контакта

В алгоритме применяется так называемый метод наименьших квадратов (МНК), описанный в Приложении 1. Листинг программы на языке С++, реализующей разработанный алгоритм, приведён в Приложении 2. Алгоритм нахождения точки касания состоит в следующем:

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

  2. Из набора данных берутся первые две точки, после чего при помощи МНК линейно аппроксимируются. Получаются коэффициенты для прямой y=aL x+bL и среднеквадратичное отклонение.

  3. Далее берутся точки начиная с третьей и до последней, по ним так же рассчитываются коэффициенты (aR и bR) и отклонение.

  4. В цикле к сумме, полученной в результате пункта 2 прибавляются координаты следующей по счёту точки, а из суммы, полученной в результате пункта 3 вычитаются координаты первой по счёту точки. Коэффициенты aL, bL, aR, bR и отклонения пересчитываются. Другими словами точка разбиения всех данных на два последовательных набора смещается на одну от начала к концу.

  5. В том же цикле методом текущего минимума ищется минимум суммарного отклонения.

  6. Далее происходит смещение точки разбиения к началу, пока аппроксимированная линия не попадёт в интервал заданной погрешности, при этом коэффициенты линейной аппроксимации пересчитываются.

  7. Точка разбиения, на которой мы остановились и есть точка контакта.

3 Экспериментальные результаты: апробация разработанного алгоритма на примере серии измерений твердости образца твердого сплава на основе кубического нитрида бора

3.1 Апробация алгоритма

В качестве измерительного прибора использовался NanoScan 3D. Измерения проводились на образце кубического нитрида бора, представляющем собой круглую пластину диаметром 49 миллиметров. Пластина была получена в прессе методом объёмного сжатия, с последующей раскройкой и подготовкой поверхности методом глубокой шлифовки-полировки.

На пластине было проведено в общей сложности 144 измерения (сетка 12 на 12 с шагом 2 мм). Максимальная нагрузка при индентировании составляла 750±10 мН. Далее, на основе полученных данных были построены кривые нагружения-разгрузки (пример см. на рисунке 9).

Рисунок 9. Пример полученной в эксперименте кривой нагружения-разгрузки

Кривые нагружения-разгрузки были получены двумя способами — при ручном указании точки контакта и при пакетной автоматической обработке при помощи разработанного алгоритма. Часть результатов представлена в таблицах 1 (ручной режим: точка контакта выбирается визуально) и 2 (автоматическая обработка алгоритмом). Строки с одинаковыми номерами получены из одних и тех же испходных данных.

Таблица 1. Данные обработанные в пакетном режиме

ContactDepth (nm)

Load (mN)

H (GPa)

E (GPa)

R (%)

1

783.82

750.27

39.42

364.33

46.2

2

1394.40

750.18

12.30

400.73

30.7

3

950.85

750.44

27.01

248.10

47.2

4

1272.68

750.40

14.65

876.03

43.5

5

1315.84

750.51

22.60

382.17

39.92

6

820.95

750.30

34.36

324.99

40.8

7

1244.41

750.39

15.54

127.85

50.6

8

767.10

750.22

42.02

945.79

50.6

9

830.29

750.36

33.30

395.83

47.9

10

663.76

750.33

55.85

682.93

50.6

Таблица 2. Данные, обработанные вручную

ContactDepth (nm)

Load (mN)

H (GPa)

E (GPa)

R (%)

1

794.71

750.21

37.81

354.48

45.8

2

1326.74

745.49

13.14

419.46

31.5

3

950.85

750.44

27.01

248.10

47.2

4

1288.83

750.32

14.17

850.91

43.0

5

1227.11

744.56

27.31

435.90

42.2

6

852.18

750.26

31.20

305.63

39.9

7

1250.50

750.19

15.33

126.92

50.5

8

672.43

733.38

53.54

1231.83

54.1

9

852.98

750.25

31.13

378.20

46.9

10

672.72

750.09

54.72

672.18

50.2

Конечные результаты измерений для ручной обработки и обработки алгоритмом приведены в таблице 3.

Таблица 3. Конечные результаты измерений

Режим

Load (mN)

E (GPa)

H (GPa)

R (%)

Алгоритм

750±1 (0.1%)

384±156 (41%)

26.1±5.7 (22%)

42.9±2.6 (6%)

Ручной

746±7 (1%)

485±241 (50%)

29.4±8.8 (30%)

42.7±2.9 (7%)

Видно хорошее соответствие между результатами ручного и автоматического режима, а также уменьшение погрешностей при расчёте нагрузки всех показателей, что указывает на эффективность алгоритма.

3.2 Границы применимости алгоритма

Несмотря на то, что алгоритм почти во всех случаях дал хорошие резуль, в некоторых измерениях (6 из 144) выполнение алгоритма заканчивалось неудачей. Пример такого измерения приведён на рисунке 10.

Рисунок 10. Пример измерения, на котором алгоритм оказался неэффективным

Отказ алгоритма объясняется выбросом на графиках P(t) и h(t). Объяснить нелинейность можно посторонними вибрациями во время измерения (например, кто-то схватился за прибор). В таких случаях для обработки приходится указывать точку контакта вручную.Заключение

Созданный алгоритм показал свою эффективность и точность в большом числе случаев. Однако, в некоторых случаях (см. рис. 10) он может оказаться неэффективным. С учётом небольшого количества подобных случаев (около 5%) время обработки данных сокращается более чем в 20 раз. Наблюдается уменьшение случайной погрешности в случае использования алгоритма. На текущий момент оптимальным решением является совмещение автоматического и ручного режимов.

Приложение 1. Алгоритм метода наименьших квадратов

Пусть есть некоторый набор экспериментальных точек, имеющих две координаты — (xi,yi) и число таких точек равно n. Задача метода наименьших квадратов заключается в нахождении коэффициентов линейной зависимости, при которых функция двух переменных а и b

принимает наименьшее значение. То есть, при данных а и b сумма квадратов отклонений экспериментальных данных от найденной прямой будет наименьшей. В этом вся суть метода наименьших квадратов.
Таким образом, решение примера сводится к нахождению экстремума функции двух переменных.
Составляется и решается система из двух уравнений с двумя неизвестными. Находим частные производные функции

по переменным а и b, приравниваем эти производные к нулю.




Решаем полученную систему уравнений любым методом (например, методом подстановки или методом Крамера) и получаем формулы для нахождения коэффициентов по методу наименьших квадратов.



При данных а и b функция

принимает наименьшее значение.

Приложение 2. Листинг программы на С++ автоматического определения точки касания.

BOOL CNSCtrlMath::FindZeroLoadingPointA(double* pX, double* pY, int i0, int i1, int nCourse, int nTurn, double &fAngle, double &fZero, int &k0,/*rusakov*/double fLevel)

// nCourse - "1" - вперёд, "-1" - назад (работает только 1)

// nTurn - "1" - направо, "-1" - налево (работает только -1)

// i0 - first point

// i1 - last point

// k0 - beginning of search and result

// fLevel - кол-во среднеквадратичных отклонений, определяющее окрестность аппроксимирующей прямой

// GoBack - "1" - идти назад после нахождения поворота, пока возможно; "0" - никуда не идти

// fLevelBack - кол-во среднеквадратичных отклонений, определяющее окрестность аппроксимирующей прямой при движении назад

{

if(i1 <= i0 + 2) return FALSE;

int i=0, j=0, knew=0;

double fSxL=0.0; // сумма значений xi

double fSyL=0.0; // сумма значений yi

double fSxxL=0.0; // сумма квадратов xi*xi

double fSyyL=0.0; // сумма квадратов yi*yi

double fSxyL=0.0; // сумма произведений xi*yi

double aL=0.0, bL=0.0, cL=0.0;

double fAngleL=0.0, fZeroL=0.0, fSd2L=0.0;

double fSxR=0.0; // сумма значений xi

double fSyR=0.0; // сумма значений yi

double fSxxR=0.0; // сумма квадратов xi*xi

double fSyyR=0.0; // сумма квадратов yi*yi

double fSxyR=0.0; // сумма произведений xi*yi

double aR=0.0, bR=0.0, cR=0.0;

double fAngleR=0.0, fZeroR=0.0, fSd2R=0.0;

double fSd2=0.0, fSigma=0.0; /*, rusakov fLevel=3.0;*/

for(i=i0; i<=i0+1; i++) {

fSxL += pX[i];

fSyL += pY[i];

fSxxL += pX[i] * pX[i];

fSyyL += pY[i] * pY[i];

fSxyL += pX[i] * pY[i];

}

aL = 2.0*fSxyL - fSxL*fSyL;

bL = fSxxL*fSyL - fSxL*fSxyL;

cL = 2.0*fSxxL - fSxL*fSxL;

fAngleL = aL/cL;

fZeroL = bL/cL;

fSd2L = fSyyL + fAngleL*fAngleL*fSxxL + 2.0*fZeroL*fZeroL - 2.0*fAngleL*fSxyL - 2.0*fZeroL*fSyL + 2.0*fAngleL*fZeroL*fSxL;

for(i=i0+2; i<=i1; i++) {

fSxR += pX[i];

fSyR += pY[i];

fSxxR += pX[i] * pX[i];

fSyyR += pY[i] * pY[i];

fSxyR += pX[i] * pY[i];

}

aR = double(i1-i0-1)*fSxyR - fSxR*fSyR;

bR = fSxxR*fSyR - fSxR*fSxyR;

cR = double(i1-i0-1)*fSxxR - fSxR*fSxR;

fAngleR = aR/cR;

fZeroR = bR/cR;

fSd2R = fSyyR + fAngleR*fAngleR*fSxxR + double(i1-i0-1)*fZeroR*fZeroR - 2.0*fAngleR*fSxyR - 2.0*fZeroR*fSyR + 2.0*fAngleR*fZeroR*fSxR;

fSigma = sqrt((fSd2L + fSd2R)/double(i1-i0));

fSd2 = fSd2L + fSd2R;

knew = i0 + 1;

for(i=i0+2; i<=i1-1; i++) {

fSxL += pX[i];

fSyL += pY[i];

fSxxL += pX[i] * pX[i];

fSyyL += pY[i] * pY[i];

fSxyL += pX[i] * pY[i];

aL = double(i-i0+1)*fSxyL - fSxL*fSyL;

bL = fSxxL*fSyL - fSxL*fSxyL;

cL = double(i-i0+1)*fSxxL - fSxL*fSxL;

fAngleL = aL/cL;

fZeroL = bL/cL;

fSd2L = fSyyL + fAngleL*fAngleL*fSxxL + double(i-i0+1)*fZeroL*fZeroL - 2.0*fAngleL*fSxyL - 2.0*fZeroL*fSyL + 2.0*fAngleL*fZeroL*fSxL;

fSxR -= pX[i];

fSyR -= pY[i];

fSxxR -= pX[i] * pX[i];

fSyyR -= pY[i] * pY[i];

fSxyR -= pX[i] * pY[i];

aR = double(i1-i)*fSxyR - fSxR*fSyR;

bR = fSxxR*fSyR - fSxR*fSxyR;

cR = double(i1-i)*fSxxR - fSxR*fSxR;

fAngleR = aR/cR;

fZeroR = bR/cR;

fSd2R = fSyyR + fAngleR*fAngleR*fSxxR + double(i1-i)*fZeroR*fZeroR - 2.0*fAngleR*fSxyR - 2.0*fZeroR*fSyR + 2.0*fAngleR*fZeroR*fSxR;

if(fSd2 > fSd2L + fSd2R) {

fSd2 = fSd2L + fSd2R;

knew = i;

}

}

// go back while possible

fSxL=0.0, fSyL=0.0, fSxxL=0.0, fSyyL=0.0, fSxyL=0.0;

for(i=i0; i<=knew; i++) {

fSxL += pX[i];

fSyL += pY[i];

fSxxL += pX[i] * pX[i];

fSyyL += pY[i] * pY[i];

fSxyL += pX[i] * pY[i];

}

aL = double(knew-i0+1)*fSxyL - fSxL*fSyL;

bL = fSxxL*fSyL - fSxL*fSxyL;

cL = double(knew-i0+1)*fSxxL - fSxL*fSxL;

fAngleL = aL/cL;

fZeroL = bL/cL;

fSd2L = fSyyL + fAngleL*fAngleL*fSxxL + double(knew-i0+1)*fZeroL*fZeroL - 2.0*fAngleL*fSxyL - 2.0*fZeroL*fSyL + 2.0*fAngleL*fZeroL*fSxL;

fSigma = sqrt(fSd2L/double(knew-i0));

while(knew > i0 + 2 && pY[knew+1] > fAngleL*pX[knew+1] + fZeroL + fLevel*fSigma) {

// while(knew > i0 + 2 && pY[knew] > fAngleL*pX[knew] + fZeroL) {

fSxL -= pX[knew];

fSyL -= pY[knew];

fSxxL -= pX[knew] * pX[knew];

fSyyL -= pY[knew] * pY[knew];

fSxyL -= pX[knew] * pY[knew];

knew--;

aL = double(knew-i0+1)*fSxyL - fSxL*fSyL;

bL = fSxxL*fSyL - fSxL*fSxyL;

cL = double(knew-i0+1)*fSxxL - fSxL*fSxL;

fAngleL = aL/cL;

fZeroL = bL/cL;

//fSd2L = fSyyL + fAngleL*fAngleL*fSxxL + double(knew-i0+1)*fZeroL*fZeroL - 2.0*fAngleL*fSxyL - 2.0*fZeroL*fSyL + 2.0*fAngleL*fZeroL*fSxL;

//fSigma = sqrt(fSd2L/double(knew-i0));

}

k0 = knew;

fAngle = fAngleL;

fZero = fZeroL;

return TRUE;

}

Библиография

  1. А. Мешков, Ю. Тихомиров / Visual C++ и MFC. Программирование для Windows NT и Windows 95: в трёх томах — СПб: BHV — Санкт-Петербург, 1997

  2. Фрэнк Крокет / MFC. Мастерская разработчика. Пер. с англ. — М.: Издательский отдел «Русская Редакция» ТОО «Channel Trading Ltd.», 1998.

  3. В.Н. Решетов, Е.О. Баранова / Сканирующая зондовая микроскопия: учебно-методическое пособие — Троицк: ФГУ ТИСНУМ, 2011

  4. В.Л. Миронов / Основы сканирующей зондовой микроскопии: учебное пособие для студентов старших курсов высших учебных заведений — Нижний Новгород: Российская Академия Наук, Институт физики микроструктур, 2004

  5. W.C. Oliver, G.M. Pharra / Measurement of hardness and elastic modulus by instrumented indentation: Advances in understanding and refinements to methodology — Journal of Materials Research, 2004, vol. 19 (1), p.3-20