Мои Конспекты
Главная | Обратная связь

...

Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

Теоретические сведения





Помощь в ✍️ написании работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

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

Из нескольких возможных способов построения гладких кри­вых выберем форму В-сплайна. Из заданной последовательности точек выбираются две соседние точки и между ними строится кривая кубического полинома на основе позиций четырех точек – двух уже известных и двух соседних с ними точек. В-сплайн обеспечивает получение более гладких кривых, чем другие спо­собы сглаживания за счет того, что получаемые кривые не прохо­дят точно через заданные точки. Математически гладкость кри­вых выражается в терминах непрерывности параметрических представлений и и их производных. Кривые типа В-сплайна обладают свойством непрерывности даже вторых произ­водных и в точках стыковки двух соседних сегментов кривой (рис. 2.1: а – нулевая производная разрывна; б – первая производная не непрерывна; в – вторая производная не непрерывна).

Рис. 2.1

На рис. 2.1 можно видеть, как выглядят кривые, если их нулевая, первая и вторая производные не непрерывны в некото­рой точке. Кривая на рис. 2.1, в может считаться гладкой, но она не удовлетворяет строгим требованиям, которые выполня­ются в способе В-сплайна.

Рассмотрим метод В-сплайна в работе. Будем использовать параметрическое представление кривых. Любая точка части кривой между двумя заданными последовательными точками Р и Q будет иметь координаты и , где увеличивается от 0 до 1, если отслеживается часть кри­вой от точки Р до точки Q. Можно считать, что это время. Если имеются заданные точки

(2.1)

то часть кривой В-сплайна между двумя последовательными точками и получается путем вычисления функций и для изменения от 0 до 1 по правилу Горнера:

(2.2)

Эти уравнения содержат следующие коэффициенты:

(2.3)

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

Для получения некоторого представления о свойствах кривой в точках стыковки двух сегментов рассмотрим функцию и ее первую и вторую производные для значений и (функция будет обладать аналогичными свойствами):

(2.4)

Используя уравнение (2.3), после упрощения получаем

(2.5)

Можно видеть, что значение х(0) не равно в точности х-координате точки , оно зависит от позиций точек и . Для трех последовательных точек (рис. 2.2) видно, что точка B является точкой сегмента АВ, но од­новременно и начальной точкой сегмента ВС.

Рис. 2.2

Для первого сегмента имеем

(2.6)

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

(2.7)

Отсюда видно, что оба способа вычисления значения х дают одинаковый результат, что означает непрерывность функции в точке В. Продифференцировав дважды, найдем произ­водные и . Подставляя в них значения и , как это было сделано для , можно убедиться, что производ­ные непрерывны в точке B. Поскольку функция и ее первые две производные также непрерывны, то становится ясно, что кри­вая В-сплайна очень гладкая.

Для расчета любого сегмента кривой между точками и используются также точки и . Из этого следует, что пер­вый сегмент кривой будет располагаться между точками и , а последний – между точками и , следовательно, начальная и конечная точки всей кривой будут располагаться вблизи точек и , но не вблизи точек и .

Реализация типового варианта

1. Расчет в среде программирования Visual C++.

1.1. Запустите на выполнение среду Visual C++ (Пуск | Программы | Microsoft Visual Studio.Net) и создайте проект консольного приложения BSplineConsole(File | New | Project) (рис. 2.3).

Рис. 2.3

1.2. Отредактируйте файл с главной функцией.

#include "stdafx.h"

#include <math.h>

#define MAX 100 // максимальное количество элементов массивов точек

#define N 3// количество промежуточных точек сплайна на интервале

int _tmain(int argc, _TCHAR* argv[])

{

Int

N,i,j;

Float

x[MAX],y[MAX],// табличная функция

X,Y,t,// точка сплайна {X(t),Y(t)}

xA,xB,xC,xD,// четыре базовые точки (x,y) сплайна

YA,yB,yC,yD,

a0,a1,a2,a3,// коэффициенты полинома X(t)

b0,b1,b2,b3;// коэффициенты полинома Y(t)

FILE

*fp;// файловая переменная

fp=fopen("BSpline.dat","r"); // открытие файла исходных данных

fscanf(fp,"%d",&n);

for (i=0;i<=n;i++)

fscanf(fp,"%f%f",&x[i],&y[i]);// заданные точки

fclose(fp);

fp=fopen("BSpline.out","w");// открытие файла результатов

for (i=1;i<n-1;i++)// проход по отрезкам табличной функции

{

xA=x[i-1]; yA=y[i-1];// выборка базовых точек для отрезка

xB=x[i]; yB=y[i];

xC=x[i+1]; yC=y[i+1];

xD=x[i+2]; yD=y[i+2];

// расчет коэффициентов для X(t), Y(t)

a3=(-xA+3*(xB-xC)+xD)/6.0; b3=(-yA+3*(yB-yC)+yD)/6.0;

a2=(xA-2*xB+xC)/2.0; b2=(yA-2*yB+yC)/2.0;

a1=(xC-xA)/2.0; b1=(yC-yA)/2.0;

a0=(xA+4*xB+xC)/6.0; b0=(yA+4*yB+yC)/6.0;

// расчет промежуточных точек сплайна

for (j=0;j<=N;j++)

{

t=(float)j/(float)N;

X=((a3*t+a2)*t+a1)*t+a0;

Y=((b3*t+b2)*t+b1)*t+b0;

fprintf(fp,"%5.2f %5.2f\n",X,Y);

}

}

fclose(fp);

return 0;

}

1.3. Добавьте в проект текстовый файл исходных данных BSpline.dat (команда Project | Add New Item...) (рис. 2.4).

1.4. Новый файл откроется на вкладке редактора (рис. 2.5). Введите исходные данные в файл BSpline.dat(количество точек и пары их координат).

1.5. Откомпилируйте проект и выполните приложение (Ctrl+F5).

1.6. Добавьте в проект текстовый файл результатов BSpline.out (команда Project | Add Existing Item...) (рис. 2.6).

Рис. 2.4

Рис. 2.5

1.7. Файл результатов откроется на вкладке редактора (рис. 2.7).

1.8. Перенесите столбцы координат табличной функции из файла BSpline.dat и рассчитанных точек сплайна из файла BSpline.out в документ Microsoft Excel для построения графика (рис. 2.8).

1.9. Выделите курсором мыши таблицу исходных измерений и вставьте диаграмму (Вставка | Диаграмма) (рис. 2.9).

1.10. С помощью мастера настройте свойства диаграммы и добавьте в нее график сплайна (рис. 2.10).

 

Рис. 2.6

Рис. 2.7

Рис. 2.8

Рис. 2.9

 

Рис. 2.10

2. Расчет в среде программирования Delphi.

2.1. Создайте проект консольного приложения BSpline.

2.2. Создайте текстовый файл исходных данных (File | New | Other) (рис. 2.11).

2.3. Выберите текстовый тип нового файла (рис. 2.12).

 

Рис. 2.11

Рис. 2.12

2.4. Внесите в добавленный текстовый файл File1.txt количество точек и их координаты.

0.75 1.40

0.50 1.00

0.75 0.60

2.5. Сохраните новый текстовый файл под именем BSpline.txt (команда меню File | Save As) (рис. 2.13).

Рис. 2.13

2.6. Отредактируйте главную функцию.

program BSpline;

{$APPTYPE CONSOLE}

uses

SysUtils;

Const

M=3;// количество промежуточных точек сплайна на интервале

Type

mas=array of real;

Var

n,// количество элементов массивов точек

i,j:integer;

x,y:mas;// табличная функция

Xt,Yt,t,// точка сплайна {X(t),Y(t)}

xA,xB,xC,xD,// четыре базовые точки (x,y) сплайна

YA,yB,yC,yD,

a0,a1,a2,a3,// коэффициенты полинома X(t)

b0,b1,b2,b3:real;// коэффициенты полинома Y(t)

fp:text;// файловая переменная

begin

// открытие файла исходных данных

AssignFile(fp,'BSpline.txt'); Reset(fp);

Readln(fp,n);

SetLength(x,n+1);

SetLength(y,n+1);

for i:=0 to n do

Readln(fp,x[i],y[i]);// заданные точки

CloseFile(fp);

// открытие файла результатов

AssignFile(fp,'B_Spline.out'); Rewrite(fp);

for i:=1 to n-2 do begin// проход по отрезкам табличной функции

// выборка базовых точек для отрезка

xA:=x[i-1]; yA:=y[i-1];

xB:=x[i]; yB:=y[i];

xC:=x[i+1]; yC:=y[i+1];

xD:=x[i+2]; yD:=y[i+2];

// расчет коэффициентов для X(t), Y(t)

a3:=(-xA+3*(xB-xC)+xD)/6.0; b3:=(-yA+3*(yB-yC)+yD)/6.0;

a2:=(xA-2*xB+xC)/2.0; b2:=(yA-2*yB+yC)/2.0;

a1:=(xC-xA)/2.0; b1:=(yC-yA)/2.0;

a0:=(xA+4*xB+xC)/6.0; b0:=(yA+4*yB+yC)/6.0;

// расчет промежуточных точек сплайна на отрезке

for j:=0 to M do begin

t:=1.0*j/M;

Xt:=((a3*t+a2)*t+a1)*t+a0;

Yt:=((b3*t+b2)*t+b1)*t+b0;

WriteLn(fp,Xt:6:2,Yt:6:2);

end;

end;

CloseFile(fp);

Finalize(x);

Finalize(y);

end.

2.7. Откомпилируйте проект и выполните приложение F9.

2.8. Откройте файл B_Spline.outс результатами расчета командой меню File | Open (рис. 2.14).

Рис. 2.14

2.9. Проанализируйте результаты расчета.

ВАРИАНТЫ ЗАДАНИЙ

Доверь свою работу ✍️ кандидату наук!
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



Поиск по сайту:







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.