Курсовая работа по Вычислительной математике МТУСИ

Post on 06-Aug-2015

466 Views

Category:

Documents

6 Downloads

Preview:

Click to see full reader

DESCRIPTION

Задание по курсовой работе:Для заданной электрической схемы найти такое значение параметра реактивного элемента Z, которое обеспечивает наилучшее приближение модуля коэффициента передачи по напряжению K(z,ω) к заданной частотной характеристике Kз(ω) по критерию минимума функции.

TRANSCRIPT

Московский Технический Университет Связи и Информатики

Кафедра вычислительной математики и программирования

Курсовая работапо дисциплине

Вычислительная математика(отчёт о проделанной работе)

Вариант №3

Выполнил: студент группы БСТ1101 Яковенко М.А.

Преподаватель: Сосновиков Г.К.

Москва – 2012г.Содержание:

1. Индивидуальное задание 32. Укрупнённая схема алгоритма решения задачи 43. Расчет формулы для электрической схемы 54. Решение поставленной задачи (аппроксимация) 55. Обоснование степени аппроксимирующего полинома 66. Исследование критериальной функции заданной таблицей 77. Определение оптимального значения Z*для данной функции 88. Исследование критериальной функции заданной аналитически 99. Определение оптимального значения Z*для данной функции 1010.Тестирование разработанных процедур в консоли WINDOWS

Процедура аппроксимации таблично заданной функции 11 Процедура вычисления интеграла методом трапеций 11 Процедура одномерной оптимизации методом золотого сечения 11

11.Программа WinAPI Диалоговые окна программы 12 Текст программы 15

12.Описание методов и пояснения Метод трапеций 26 Метод золотого сечения 27 Унимодальные функции 29

13.Выводы по проделанной работе и результаты 3014.Использованная литература 30

2

Индивидуальное задание

1) Составить алгоритм, написать, отладить и выполнить программу решения задачи № 1 формализованного вида.

2) Решить следующую задачу № 2 с использованием математического пакета MathCad.

Для заданной электрической схемы найти такое значение параметра реактивного элемента Z, которое обеспечивает наилучшее приближение модуля коэффициента передачи по напряжению K(z,ω) к заданной частотной характеристике Kз(ω) по критерию минимума функции

в диапазоне от 0 до 106 герц.

Для найденного оптимального значения реактивного элемента Z* рассчитать значения и построить графики коэффициента передачи K(z*,ω) и заданной частотной характеристики Kз(ω) в диапазоне частот от 0 до 106 герц.

Индивидуальное задание содержит: 1. Заданную электрическую схему. 2. Заданную частотную характеристику.Для всех схем величины резисторов равны 1000 Ом.

Решение данной задачи распадается на 2 этапа:1. Исследование критериальной функции F(Z) и определение интервала (A,B),

содержащего минимум Z*. Границы интервала исследования функции (10-10 - 10-7 ) Ф. При исследовании рекомендуется удваивать значения Z.

2. Непосредственное определение Z* одним из методов одномерной оптимизации с использованием стандартной функции пакета MathCad.

Метод вычисления интеграла: метод трапеций.Метод одномерной оптимизации: метод золотого сечения.

Схема цепи:

Частотная функция, заданная в явном виде:

Таблица значений заданной частотной характеристики:

3

0 1.25*105 2.5*105 3.75*105 5.00*105 6.25*105 7.50*105 8.75*105 106

0.5 0.598 0.691 0.778 0.854 0.916 0.962 0.99 1

4

Укрупнённая схема алгоритма решения задачи

Начало

Исследование критериальной функции F(Z) и определение интервала (A,B), содержащего

минимум Z*.

Конец

Проверка заданной точности

Вычисление интеграла в точке

Вычисление новых границ отрезка

Вычисление интеграла(метод трапеций)

Оптимизация(метод золотого сечения)

Нахождение начального интервала оптимизации и унимодальности функции

5

Расчет формулы для электрической схемы.В данной схеме комплексное сопротивление будет равно

отношению сопротивления R2 к сумме R2 и общего сопротивления R1 и C. Получаем следующую формулу:

Модуль данного сопротивления равен

Решение поставленной задачи.Для нахождения частотной характеристики получим аппроксимирующий

полином второй степени методом наименьших квадратов для функции, заданной таблично, с помощью средств математического пакета MathСad:

Таким образом, частотная характеристика имеет вид:

6

Обоснование выбора степени аппроксимирующего полинома.Для подтверждения правильности выбора степени аппроксимирующего полинома

построим их графики.

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

7

Исследование критериальной функции заданной таблицей.Необходимо исследовать поведение критериальной функции

, где - аппроксимирующая функция

и определим интервал (A,B), содержащий минимум .

Границы интервала заданы условием задачи: (10-10-10-7).

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

По графику видно, что функция имеет единственный минимум на отрезке

8

[2*10-9;4*10-9].

9

Определение оптимального значения Z* для функции заданной таблицей.

Оптимальное значение реактивного элемента Z* будем искать, используя метод трапеций для вычисления интеграла и метод золотого сечения для одномерной оптимизации.

Для подтверждения правильности решения необходимо оптимальное значение реактивного элемента Z* сравнить с двумя близкими значениями. Убедиться в правильности решения можно с помощью графика.

Для того, чтобы интегральная функция F(Z) имела минимальное значение, нужно чтобы квадрат разности Kz(w) и K(z,w) был минимальным. Это достигается, если график K(z,w) будет максимально приближен к графику Kz(w).

Рассматривая график видно, что K(Z1, w) наиболее приближен к графику Kz(w), чем графики K(Z2, w) и K(Z3, w) при произвольных Z2 и Z3, близких к Z1.

Значит минимальный Z = Z1= 0.00000000268244779425.

10

Исследование критериальной функции заданной аналитически.Исследуем поведение критериальной функции

, где - аналитическая функция

и определим интервал (A,B), содержащий минимум .

Границы интервала остаются неизменными: (10-10-10-7).Вначале также определяем отрезок, на котором функция будет унимодальна. Для

этого строим график функции F(Z) и определяем границы отрезка, где функция имеет единственный минимум:

Из графика видно, что функция имеет единственный минимум

на отрезке [10-10,10-9]

11

Определение оптимального значения Z* для функции заданной аналитически.

Оптимальное значение реактивного элемента Z* можно определить по графику: так как данная функция имеет минимум на границе отрезка, то Z*=10-10

Для проверки правильности построим графики K(Z,w) и K3(w) на отрезке [0;10-6], где Z1=Z*,Z2=2*10 - 1 0 ,Z3=5*10 - 1 0 и сравним значения:

Для того, чтобы интегральная функция F(Z) имела минимальное значение, нужно чтобы квадрат разностиKz(w) и K(z,w) был минимальным. Это достигается, если график K(z,w) будет максимально приближен к графику Kz(w).

Рассматривая график видно, что K(Z1, w) наиболее приближен к графику Kz(w), чем графики K(Z2, w) и K(Z3, w) при произвольных Z2 и Z3, близких к Z1.

Значит минимальный Z = Z1= 10-10.

12

Тестирование разработанных процедур в консоли WINDOWS.Процедура аппроксимации таблично заданной функции.

На вход программы подаем табличные значения функции y=x2:x 0 1 2 3 4y 0 1 4 9 16

Получаем следующие коэффициенты:

Функция работает верно.

Процедура вычисления интеграла методом трапеций.Для проверки работы процедуры произведем расчет интеграла от функции y=x2 на

интервале от 0 до 1.

Ожидаемый результат равен

a=0; b=1; h=0.5; E=0.0001.

Результат работы программы:

Данный результат верен с заданной точностью, значит, процедура работает правильно.

Процедура одномерной оптимизации методом золотого сечения.Для проверки работы данной процедуры рассчитаем минимум функции y=x2 на

интервале от -1 до 1. Ожидаемый результат равен 0.

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

13

Диалоговые окна программы.

14

15

16

Текст программы.Kursovaya.cpp

#include "stdafx.h"#include "Kursovaya.h"

#define MAX_LOADSTRING 100

HINSTANCE hInst;TCHAR szTitle[MAX_LOADSTRING];TCHAR szWindowClass[MAX_LOADSTRING];

ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);BOOL CALLBACK integralSettings(HWND, UINT, WPARAM, LPARAM);BOOL CALLBACK optimizSettings(HWND, UINT, WPARAM, LPARAM);BOOL CALLBACK aproksimSettings(HWND, UINT, WPARAM, LPARAM);BOOL CALLBACK zadachaSettings(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){

UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);

MSG msg;HACCEL hAccelTable;

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_VMKURSOVAYA, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);

if (!InitInstance (hInstance, nCmdShow)){

return FALSE;}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_VMKURSOVAYA));

while (GetMessage(&msg, NULL, 0, 0)){

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){

TranslateMessage(&msg);DispatchMessage(&msg);

}}

return (int) msg.wParam;}

ATOM MyRegisterClass(HINSTANCE hInstance){

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

17

wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance,

MAKEINTRESOURCE(IDI_VMKURSOVAYA));wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName = MAKEINTRESOURCE(IDC_VMKURSOVAYA);wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ HWND hWnd;

hInst = hInstance;

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd) { return FALSE; }

ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);

return TRUE;}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){

int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;

switch (message){case WM_COMMAND:

wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);switch (wmId){case IDM_ZADACHA:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ZADACHA), hWnd, zadachaSettings);break;

case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;

case ID_ZADANIE:DialogBox(hInst, MAKEINTRESOURCE(IDD_ZADANIE), hWnd, About);break;

case IDM_EXIT:DestroyWindow(hWnd);break;

default:

18

return DefWindowProc(hWnd, message, wParam, lParam);}break;

case WM_PAINT:hdc = BeginPaint(hWnd, &ps);EndPaint(hWnd, &ps);break;

case WM_DESTROY:PostQuitMessage(0);break;

default:return DefWindowProc(hWnd, message, wParam, lParam);

}return 0;

}

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){

UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:

return (INT_PTR)TRUE;

case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){

EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;

}break;

}return (INT_PTR)FALSE;

}

Функции.cpp//Аппроксимирующий полиномlong double apr(long double w){

long double rez = 0;for (int i = 0; i < aproksimOut.count;i++)

rez += aproksimOut.k[i] * pow(w,i);return rez;

}

//Функция, рассчитанная по схемеlong double wz(long double w, long double z){

long double R2 = 1000, R1 = 1000;if (w == 0) w = 0.00000001;long double rez = sqrt(R2*R2+(w*w*z*z*R1*R1*R2*R2))/sqrt((R1*R1)+(R2*R2)+

(w*w*z*z*R1*R1*R2*R2));return rez;

}

//Функция, заданная аналитическиlong double fw(long double w){

long double R2 = 1000, R1 = 1000;long double rez = R2/(R1+R2)+R1/(R1+R2)*(sin(w*M_PI/(2*pow(10.,6))));return rez;

19

}

//Функция F(X) (по которой берем интеграл)long double f(long double w, long double z, int func){

switch (func){

case 0:{

return pow(fw(w)-wz(w,z),2);break;

}case 1:{

return pow(apr(w)-wz(w,z),2);break;

}case 2:{

return pow(w,2);break;

}

};return 0;

}

Функция вычисления интеграла.cpplong double trapeze(long double a, long double b, long double e, long double z, int func){

integralOut.count = 0;long int n = 1;long double h = b-a;long double s = (f(a,z,func)-f(b,z,func))*h/2, s1;do{

s1 = s;n *=2;h = (b-a)/n;s = f(a,z,func)+f(b,z,func);for (int i = 1; i < n;i++)

s+=2*f(a+i*h,z,func);s*=h/2;integralOut.s[integralOut.count] = s;integralOut.h[integralOut.count] = h;integralOut.n[integralOut.count] = n;integralOut.count++;

}while (fabs(s-s1)/3 >=e);return s;

}

Функция оптимизации.cpplong double goldCut(long double a,long double b,long double e, long double ei, int func, int method){

optimizOut.count=0;long double ai = 0, bi = 1000000; long double k1=(3.-sqrt(5.))/2.;long double k2=(sqrt(5.)-1)/2.;long double x1=a+k1*(b-a);long double x2=a+k2*(b-a);long double F1 = fOpt(ai,bi,ei,x1,func,method), F2 = fOpt(ai,bi,ei,x2,func,method);while ((b-a)>e)

20

{if (F1<F2){

b=x2;x2=x1;x1=a+k1*(b-a);F2=F1;F1 = fOpt(ai,bi,ei,x1,func,method);

}else{

a=x1;x1=x2;x2=a+k2*(b-a);F1=F2;F2 = fOpt(ai,bi,ei,x2,func,method);

}optimizOut.a[optimizOut.count] = a;optimizOut.b[optimizOut.count] = b;optimizOut.x1[optimizOut.count] = x1;optimizOut.x2[optimizOut.count] = x2;optimizOut.f1[optimizOut.count] = F1;optimizOut.f2[optimizOut.count] = F2;optimizOut.count++;

}long double xm=(a+b)/2;optimizOut.xmin = xm;optimizOut.ymin = fOpt(ai,bi,ei,xm,func,method);return xm;

}

Функция аппроксимации.cppvoid aproksim(int N, int K){

long double* ak = new long double[K+1];long double* b = new long double[K+1];long double* x = new long double[N+1];long double* y = new long double[N+1];long double **sums = new long double*[K+1];for (int i = 0; i < K + 1; i++)

sums[i] = new long double[K+1];

//Выделяем память и обнуляемint i,j,k;for(i=0; i<K+1; i++){

ak[i]=0; b[i]=0;

for(j=0; j<K+1; j++) sums[i][j] = 0;

}

//Записываем x,yfor(k=0; k<N; k++){

x[k]=aproksimIn.points[k].x;y[k]=aproksimIn.points[k].y;

}

//Находим суммуfor(i=0; i<K+1; i++)

for(j=0; j<K+1; j++){

sums[i][j] = 0;

21

for(k=0; k<N; k++)sums[i][j] += pow(x[k], i+j);

}

//Значение правых частейfor(i=0; i<K+1; i++)

for(k=0; k<N; k++)b[i] += pow(x[k], i) * y[k];

long double temp=0;for(i=0; i<K+1; i++)

if(sums[i][i]==0)for(j=0; j<K+1; j++){

if(j==i) continue;if(sums[j][i] !=0 && sums[i][j]!=0){

for(k=0; k<K+1; k++){

temp = sums[j][k];sums[j][k] = sums[i][k];sums[i][k] = temp;

}temp = b[j];b[j] = b[i];b[i] = temp;break;}

}

for(k=0; k<K+1; k++)for(i=k+1; i<K+1; i++){

if(sums[k][k]==0) return;

long double M = sums[i][k] / sums[k][k];for(j=k; j<K+1; j++)

sums[i][j] -= M * sums[k][j];b[i] -= M*b[k];

}

for(i=(K+1)-1; i>=0; i--){long double s = 0;for(j = i; j<K+1; j++)

s = s + sums[i][j]*ak[j];

ak[i] = (b[i] - s) / sums[i][i];}aproksimOut.count = K+1;aproksimOut.k = ak;delete[] b;delete[] x;delete[] y;for (i = 0; i < K+1; i++)

delete[] sums[i];delete[] sums;

}

22

Решение задачи.cpp

BOOL CALLBACK zadachaSettings(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){

static int methodOpt = 0;static int methodInt = 0;static int func = 1;UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:

SetDlgItemText(hDlg,IDC_EDIT_A,TEXT("0.0000000001"));SetDlgItemText(hDlg,IDC_EDIT_B,TEXT("0.0000001"));SetDlgItemText(hDlg,IDC_EDIT_E,TEXT("0.00000000001"));SetDlgItemText(hDlg,IDC_EDIT_EI,TEXT("0.000001"));SetDlgItemText(hDlg,IDC_EDIT_K,TEXT("2"));

SendMessage(GetDlgItem(hDlg, IDC_RADIO_TABL),BM_SETCHECK,1,0);

if (aproksimIn.count == NULL) aproksimIn.count=0;else{

TCHAR bufText[300];for (int i = 0; i < aproksimIn.count; i++){

pointBuf = aproksimIn.points[i];bufText[0]=0;addSubstr(bufText,TEXT("%.20lf"),pointBuf.x);addSubstr(bufText,TEXT("%.20lf"),pointBuf.y);

SendMessage(GetDlgItem(hDlg,IDC_LIST_TABL),LB_ADDSTRING,0,(LPARAM)bufText);}

}changeList(hDlg);return TRUE;

case WM_COMMAND:switch (wParam){

methodInt = 0;methodOpt = 0;

case IDC_RADIO_TABL:{

func = 1;break;

}case IDC_RADIO_ANALIT:

{func = 0;break;

}case IDC_BUTTON_ADD:

{if (DialogBox((HINSTANCE)GetModuleHandle(NULL),

MAKEINTRESOURCE(IDD_ADD_XY), hDlg, addSettings)){

aproksimIn.points[aproksimIn.count] = pointBuf;aproksimIn.count++;TCHAR bufText[300];bufText[0]=0;addSubstr(bufText,TEXT("%.20lf"),pointBuf.x);addSubstr(bufText,TEXT("%.20lf"),pointBuf.y);

SendMessage(GetDlgItem(hDlg,IDC_LIST_TABL),LB_ADDSTRING,0,(LPARAM)bufText);

23

}break;

}case IDC_BUTTON_DELETE:

{SendMessage(GetDlgItem(hDlg,

IDC_LIST_TABL),LB_RESETCONTENT,0,0);aproksimIn.count = 0;break;

}case IDC_BUTTON_START:

{int k;long double a,b,d,e,ei;readIntegral(hDlg,a,b,ei,a);readOptimiz(hDlg,a,b,e,d);readAproksim(hDlg,k);if (func == 1 && k > aproksimIn.count)

{MessageBox(hDlg, TEXT("Не хватает точек для

построения полинома выбранной степени"),TEXT("Ошибка"),MB_OK);break;

}if (func == 1){

aproksim(aproksimIn.count,k);printAproksim(hDlg);

}

goldCut(a,b,e,ei,func,methodInt);printOptimiz(hDlg);break;

}case IDOK:

{EndDialog(hDlg, TRUE); return TRUE;break;

}case IDCANCEL:

EndDialog(hDlg, FALSE);return TRUE;break;

break;}

break;}return FALSE;

}

Обработка ввода-вывода.cppbool readIntegral(HWND hDlg, long double &a, long double &b, long double &ei, long double &z){

TCHAR bufText[300];GetDlgItemText(hDlg,IDC_EDIT_A,bufText,30);swscanf(bufText,TEXT("%lf"),&a);GetDlgItemText(hDlg,IDC_EDIT_B,bufText,30);swscanf(bufText,TEXT("%lf"),&b);GetDlgItemText(hDlg,IDC_EDIT_EI,bufText,30);swscanf(bufText,TEXT("%lf"),&ei);return 1;

}

24

bool printIntegral(HWND hDlg){

HWND hListBox = GetDlgItem(hDlg, IDC_LIST_OUT);SendMessage(hListBox,LB_RESETCONTENT,0,0);TCHAR bufText[300];

for (int i = 0; i < integralOut.count;i++){

swprintf(bufText,4,TEXT("%d"),i+1);int n = wcslen(bufText);bufText[n] = TEXT(')');bufText[n+1] = 0;

addSubstr(bufText, TEXT("%.20lf"),integralOut.s[i]);addSubstr(bufText, TEXT("%.20lf"),integralOut.h[i]);addSubstr(bufText, TEXT("%.0lf"),integralOut.n[i]);SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)bufText);

}return 1;

}

bool readOptimiz(HWND hDlg, long double &a, long double &b, long double &e, long double &d){

TCHAR bufText[300];GetDlgItemText(hDlg,IDC_EDIT_A,bufText,30);swscanf(bufText,TEXT("%lf"),&a);GetDlgItemText(hDlg,IDC_EDIT_B,bufText,30);swscanf(bufText,TEXT("%lf"),&b);GetDlgItemText(hDlg,IDC_EDIT_E,bufText,30);swscanf(bufText,TEXT("%lf"),&e);

return 1;}

bool printOptimiz(HWND hDlg){

HWND hListBox = GetDlgItem(hDlg, IDC_LIST_OUT);SendMessage(hListBox,LB_RESETCONTENT,0,0);TCHAR bufText[300];

int step = 27;for (int i = 0; i < step*7; i++){

bufText[i] = TEXT(' ');if ((i-step/2)%step==0)

switch (i / step){

case 0: bufText[i] = TEXT('a'); break;case 1: bufText[i] = TEXT('b'); break;case 2:

{bufText[i] = TEXT('x'); i++;bufText[i] = TEXT('1'); break;

}case 3:

{bufText[i] = TEXT('x'); i++;bufText[i] = TEXT('2'); break;

}

25

case 4: {

bufText[i] = TEXT('F'); i++;bufText[i] = TEXT('('); i++;bufText[i] = TEXT('x');i++;bufText[i] = TEXT('1');i++;bufText[i] = TEXT(')');break;

}case 5:

{bufText[i] = TEXT('F'); i++;bufText[i] = TEXT('('); i++;bufText[i] = TEXT('x');i++;bufText[i] = TEXT('2');i++;bufText[i] = TEXT(')');break;

}case 6:

{bufText[i] = TEXT('b'); i++;bufText[i] = TEXT('-'); i++;bufText[i] = TEXT('a');break;

}}

}bufText[step*7] = 0;SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)bufText);

for (int i = 0; i < optimizOut.count;i++){

swprintf(bufText,4,TEXT("%d"),i+1);int n = wcslen(bufText);bufText[n] = TEXT(')');bufText[n+1] = 0;

addSubstr(bufText, TEXT("%.20lf"),optimizOut.a[i]);addSubstr(bufText, TEXT("%.20lf"),optimizOut.b[i]);addSubstr(bufText, TEXT("%.20lf"),optimizOut.x1[i]);addSubstr(bufText, TEXT("%.20lf"),optimizOut.x2[i]);addSubstr(bufText, TEXT("%.20lf"),optimizOut.f1[i]);addSubstr(bufText, TEXT("%.20lf"),optimizOut.f2[i]);addSubstr(bufText, TEXT("%.20lf"),optimizOut.b[i]-optimizOut.a[i]);

SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)bufText);}

swprintf(bufText,50,TEXT("%.20lf"),optimizOut.xmin);SetDlgItemText(hDlg, IDC_EDIT_XMIN,bufText);swprintf(bufText,50,TEXT("%.20lf"),optimizOut.ymin);SetDlgItemText(hDlg, IDC_EDIT_YMIN,bufText);return 1;

}

26

BOOL CALLBACK addSettings(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){

UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:

SetDlgItemText(hDlg,IDC_EDIT_X,TEXT("0"));SetDlgItemText(hDlg,IDC_EDIT_Y,TEXT("0"));return TRUE;

case WM_COMMAND:switch (wParam){case IDOK:

{TCHAR bufText[300];GetDlgItemText(hDlg,IDC_EDIT_X,bufText,30);swscanf(bufText,TEXT("%lf"),&pointBuf.x);GetDlgItemText(hDlg,IDC_EDIT_Y,bufText,30);swscanf(bufText,TEXT("%lf"),&pointBuf.y);

EndDialog(hDlg, TRUE); return TRUE;break;

}case IDCANCEL:

EndDialog(hDlg, FALSE);return TRUE;break;

break;}

break;}return FALSE;

}

bool readAproksim(HWND hDlg, int& k){

TCHAR bufText[300];GetDlgItemText(hDlg,IDC_EDIT_K,bufText,30);swscanf(bufText,TEXT("%d"),&k);return 1;

}

bool printAproksim(HWND hDlg){

HWND hListBox = GetDlgItem(hDlg, IDC_LIST_K);SendMessage(hListBox,LB_RESETCONTENT,0,0);TCHAR bufText[300];

for (int i = 0; i < aproksimOut.count;i++){

swprintf(bufText,4,TEXT("%d"),i+1);int n = wcslen(bufText);bufText[n] = TEXT(')');bufText[n+1] = 0;

addSubstr(bufText, TEXT("%.20lf"),aproksimOut.k[i]);

SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)bufText);}return 1;

}

27

Описание методов и пояснения.Вычисление интеграла методом трапеций.

Разобьем интервал интегрирования [a;b] на n равных отрезков (рис. 6.4.3-1) и восстановим из полученных точек a, х1, x2, …, bперпендикуляры до пересечения с графиком функции. Соединив последовательно точки пересечения, представим площадь полученной криволинейной трапеции как сумму прямолинейных трапеций, площади которых легко подсчитать. Заменив подынтегральную функцию f(x)в пределах элементарного отрезка [xi;xi+1] интерполяционным многочленом первой степени, получим следующие формулы для элементарных площадей:

Тогда общая площадь равна:

Отсюда получаем формулу трапеций:

Блок-схема алгоритма метода трапеций и графическая иллюстрация:

28

x

d

c

a=x0 b=xn

f(x)

Xi+1

P1(x)

x1 x2 Xn-1xi

f(x)

Одномерная оптимизация методом золотого сечения.В основу метода положено разбиение отрезка неопределенности [a;b] в

соотношении золотого сечения, такого, что отношение длины его большей части ко всей длине отрезка равно отношению длины его меньшей части к длине его большей части:

l

l2 l1

Положим l =1, тогда l22= 1 - l2 , а l2

2 + l2 -1= 0,откуда

где k1, k2- коэффициенты золотого сечения.

В методе золотого сечения каждая точка (х1 и х2)осуществляет золотое сечение отрезка.

или

Нетрудно проверить, что точка х1осуществляет золотое сечение не только отрезка [a;b], но и отрезка [a;х2]. Точно так же точка х2осуществляет золотое сечение не только отрезка [a;b], но и отрезка [х1;b]. Это приводит к тому, что значение целевой функции на каждой итерации (кроме первой) вычисляется один раз.

После каждой итерации длина отрезка неопределенности сокращается в 1.618 раза. Длина конечного отрезка неопределенности Dn = 0.618nD0, где D0= (b-a) – начальная длина отрезка.

Условие окончания процесса итераций Dn e. Отсюда можно найти количество итераций, необходимое для достижения точки минимума:

отсюда логарифмируя, получим

29

Блок-схема алгоритма оптимизации методом золотого сечения:

Начало

Вводa, b, E

x1=a+k1*(b-a)x2=a+k2*(b-a)

(b-a)<E

F1<F2

a=x1; x1=x2x2=a+k2*(b-a)

b=x2; x2=x1x1=a+k1*(b-a)

Выводx*, f*

Конец

Описание процедуры-

функцииf(x)

Нет

Нет Да

[a;b] - отрезок неопределенностиE - точность оптимизации

2/)15(2k

2/)53(1k

x*=(a+b)/2f*=f(x)

F1=f(x1)F2=f(x2)

F1=F2F2=f(x2)

F2=F1F1=f(x1)

Условие окончание итераций

Вычисление новых границ отрезка неопределенности

Да

x* - абсциса точки минимумаf* - значение целевой функции в точке минимума

к2=1-к1

30

Унимодальные функции.Более эффективные методы можно построить, если предположить, что исследуемая

функция имеет в рассматриваемом интервале только один минимум. Более точно: предположим, что в интервале [a, b] имеется единственное значение x* такое, что f(x*)- минимум f(x) на [a, b] и что f(x) строго убывает для x≤x*и строго возрастает для x≥x*. Такая функция называется унимодальной.

Для ее графика имеются три различные формы: 

 

 Заметим, что унимодальная функция не обязана быть гладкой или даже

непрерывной.

Из предположения унимодальности следует, что для любых точек x1, x2 интервала [a, b], таких, что x1 ≤ x2, ≤ X* справедливо f(x2) < f(x1). Аналогично, если X* ≤ x1 < x2 то x1 ≤ X* ≤ b. Обратно, если x1 < x2 и f(x1) > f(x2) , то x1 ≤ X* ≤ b а если f(x1) < f(x2), то a ≤ X* ≤ x2. Далее будем считать исследуемую функцию унимодальной.

31

Выводы по проделанной работе и результаты.При выполнении курсовой работы была разработана последовательность решения

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

приближение модуля коэффициента передачи по напряжению к заданной

частотной характеристике по критерию минимума функции.

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

Все функции были протестированы, что позволяет говорить об их работоспособности.

Полученные результаты:

при аналитически заданной

функции

при таблично заданной

функцииMathCad 10^-10 2.682448*10^-9Программа 0.00000000010317106901 0.00000000268244779425

F( ) при аналитически

заданной функции

F( ) при таблично

заданной функцииMathCad 3.607812523*10^4 5.98021387986*10^3Программа 36078.12958170481600000000 5980.19987888225570000000

Использованная литература.В.Н.Шакин «Пособие раздела 6»: «Тема 6.7», «Тема 6.4», «Тема 6.6».

32

ИСПРАВЛЕНИЯ К КУРСОВОЙ РАБОТЕ!!!!!!!!

Решение задачи.Для решения поставленных задач необходимо исследовать критериальные функции

заданные таблично и аналитически, а затем определить для них оптимальные значения реактивного элемента Z*.

При решении задачи с таблично заданной функцией необходимо начинать с поиска

аппроксимирующего полинома для нахождения частотной характеристики .

33

Исследование критериальной функции заданной таблицей.Необходимо исследовать поведение критериальной функции

, где - аппроксимирующая функция

и определим интервал (A,B), содержащий минимум .

Границы интервала заданы условием задачи: (10-10-10-7).

Вначале необходимо найти частотную характеристику . Для этого получим

аппроксимирующий полином второй степени методом наименьших квадратов для функции, заданной таблично, с помощью средств математического пакета MathСad:

Таким образом, частотная характеристика имеет вид:

34

Затем определяем отрезок, на котором функция будет унимодальна. Для этого необходимо построить график функции F(Z) и определить границы отрезка, где функция имеет единственный минимум:

По графику видно, что функция имеет единственный минимум на отрезке [2*10-9;4*10-9].

35

Определение оптимального значения Z* для функции заданной таблицей.

Оптимальное значение реактивного элемента Z* будем искать, используя метод трапеций для вычисления интеграла и метод золотого сечения для одномерной оптимизации.

Для подтверждения правильности решения необходимо оптимальное значение реактивного элемента Z* сравнить с двумя близкими значениями. Убедиться в правильности решения можно с помощью графика.

36

ГрафикиС оптимальным Z:

С Z больше оптимального:

С Z меньше оптимального:

37

иДля того, чтобы интегральная функция F(Z) имела минимальное значение, нужно

чтобы квадрат разности Kz(w) и K(z,w) был минимальным. Это достигается, если график K(z,w) будет максимально приближен к графику Kz(w).

Рассматривая график видно, что K(Z1, w) наиболее приближен к графику Kz(w), чем графики K(Z2, w) и K(Z3, w) при произвольных Z2 и Z3, близких к Z1.

Значит минимальный Z = Z1= 0.00000000268244779425.

38

Определение оптимального значения Z* для функции заданной аналитически.

Оптимальное значение реактивного элемента Z* можно определить по графику: так как данная функция имеет минимум на границе отрезка, то Z*=10-10

Для проверки правильности построим графики K(Z,w) и K3(w) на отрезке [0;10-6], где Z1=Z*,Z2=2*10 - 1 0 ,Z3=5*10 - 1 0 и сравним значения:

39

Для того, чтобы интегральная функция F(Z) имела минимальное значение, нужно чтобы квадрат разностиKz(w) и K(z,w) был минимальным. Это достигается, если график K(z,w) будет максимально приближен к графику Kz(w).

Рассматривая график видно, что K(Z1, w) наиболее приближен к графику Kz(w), чем графики K(Z2, w) и K(Z3, w) при произвольных Z2 и Z3, близких к Z1.

Значит минимальный Z = Z1= 10-10.

40

Тестирование разработанных процедур в консоли WINDOWS.Процедура аппроксимации таблично заданной функции.

На вход программы подаем табличные значения функции y=x2:x 0 1 2 3 4y 0 1 4 9 16

Получаем следующие коэффициенты:

Полученный полином представляет собой функцию F(x)=0+0*x+1*x2=x2.Данная функция совпадает с исходной, следовательно процедура аппроксимации работает верно.

Решение задачи с помощью MathCad.Для таблично заданной функции Для аналитически заданной функции

Так как по условию задачи значение параметра реактивного элемента должно находиться в интервале от 10-10 до 10-7, то оптимальное значение равно 10-10.

41

Выводы по проделанной работе и результаты.При выполнении курсовой работы была разработана последовательность решения

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

приближение модуля коэффициента передачи по напряжению к заданной

частотной характеристике по критерию минимума функции.

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

Все функции были протестированы, что позволяет говорить об их работоспособности.

Полученные результаты:

при аналитически заданной

функции

при таблично заданной

функцииMathCad 10^-10 2.682379*10^-9Программа 0.00000000010317106901 0.00000000268244779425

F( ) при аналитически

заданной функции

F( ) при таблично

заданной функцииMathCad 3.60761005*10^4 5.980214*10^3Программа 36078.12958170481600000000 5980.19987888225570000000

Использованная литература.В.Н.Шакин «Пособие раздела 6»: «Тема 6.7», «Тема 6.4», «Тема 6.6».

42

top related