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

51
Московский Технический Университет Связи и Информатики Кафедра вычислительной математики и программирования Курсовая работа по дисциплине Вычислительная математика (отчёт о проделанной работе) Вариант №3

Post on 06-Aug-2015

427 views

Category:

Documents


6 download

DESCRIPTION

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

TRANSCRIPT

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

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

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

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

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

Вариант №3

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

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

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

Москва – 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

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

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

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

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

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

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

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

Начало

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

минимум Z*.

Конец

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

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

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

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

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

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

5

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

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

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

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

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

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

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

6

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

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

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

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

7

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

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

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

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

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

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

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

8

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

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

9

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

Определение оптимального значения 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

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

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

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

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

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

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

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

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

11

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

Определение оптимального значения 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

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

Тестирование разработанных процедур в консоли 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

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

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

14

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

15

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

16

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

Текст программы.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

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

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

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

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

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

}

//Функция 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

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

{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

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

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

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

Решение задачи.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

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

}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

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

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

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

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

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

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

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

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

Разобьем интервал интегрирования [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)

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

Одномерная оптимизация методом золотого сечения.В основу метода положено разбиение отрезка неопределенности [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

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

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

Начало

Ввод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

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

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

функция имеет в рассматриваемом интервале только один минимум. Более точно: предположим, что в интервале [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

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

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

задачи, заключающейся в нахождении минимума значения параметра реактивного элемента 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

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

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

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

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

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

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

33

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

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

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

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

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

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

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

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

34

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

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

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

35

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

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

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

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

36

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

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

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

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

37

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

иДля того, чтобы интегральная функция 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

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

Определение оптимального значения 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

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

Для того, чтобы интегральная функция 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

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

Тестирование разработанных процедур в консоли 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

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

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

задачи, заключающейся в нахождении минимума значения параметра реактивного элемента 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