Использование метода наименьших квадратов при решении электротехнических задач

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Аннотация

В данной курсовой работе я рассмотрел задачу о зависимости тока ротора АД АИУМ225М4 от напряжения при различных коэффициентах нагрузки. Составил программу для вычисления коэффициента корреляции, подбора методом наименьших квадратов. Контрольный расчет был проведен при помощи математического пакета MathCad.

Содержание

  • Введение
  • 1. Постановка задачи
  • 2. Описание математической модели решения задачи
  • 3. Блок-схема алгоритма
  • 4. Описание программы
  • 4. 1 Описание алгоритма программы
  • 4. 2 Описание выполнения программы
  • 5. Характеристика данных и их условные обозначения
  • 6. Текст программы
  • 7. Контрольный пример
  • 8. Анализ результатов
  • Заключение
  • Список литературы
  • Приложение

Введение

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

1. Постановка задачи

Известны зависимости тока ротора АД АИУМ225М4 от напряжения при различных коэффициентах нагрузки.

Для зависимостей с коэффициентами нагрузки 1, 1,3 вычислить коэффициент корреляции; методом наименьших квадратов подобрать зависимости вида

,

вычислить индекс корреляции, суммарную квадратичную ошибку, среднюю ошибку в точке и относительную ошибку. Найти ожидаемое значение токов при напряжениях 0,72, 0,98, 1,23. Номинальной ток ротора 52 А.

В программе исходные данные рекомендуется считывать из файла aium225m4. txt или с клавиатуры. Результаты вычислений сохранить в текстовом файле rezult. txt. Средствами математического пакета или электронных таблиц проверить результаты работы программы, построить график экспериментальной зависимости и подобранной функции.

Рисунок 1. График исходных данных

2. Описание математической модели решения задачи

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

Таблица 1- экспериментальные данные

Идея метода наименьших квадратов заключается в том, что функцию

необходимо подобрать таким образом, чтобы сумма квадратов отклонений измеренных значений yi от расчетных Yi была наименьшей:

Рисунок 2. Визуализация метода найменьших квадратов

Геометрическая интерпретация метода наименьших квадратов Задача сводится к определению коэффициентов. Для ее решения необходимо составить систему уравнений

Если параметры ai входят в зависимость

линейно, то получим систему из k-линейных уравнений с k неизвестными:

Зная коэффициенты, являющиеся решением системы, можно составить искомую функцию

Подбор параметров линейной функции

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

Сформируем систему линейных уравнений, решив которую, определим коэффициенты функции:

Кубическая функция

Необходимо определить параметры многочлена третьей степени:

Составим функцию

Система уравнений для вычисления параметров примет вид:

Полином k-й степени

Необходимо определить параметры многочлена k-й степени:

Тогда система уравнений для определения параметров ak принимает вид:

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

Уравнение регрессии и коэффициент корреляции

Линия, описываемая уравнением вида y = a0 + a1x, называется линией регрессии y на x, параметры a0 и a1 называются коэффициентами регрессии и определяются формулами.

Чем меньше величина тем более обоснованно

предположение, что экспериментальные данные описываются линейной функцией. Существует показатель, характеризующий тесноту линейной связи между x и y, называемый коэффициентом корреляции и рассчитываемый по формуле:

Значение коэффициента корреляции удовлетворяет соотношению:

.

Чем меньше отличается абсолютная величина r от единицы, тем ближе к линии регрессии располагаются экспериментальные точки. Если коэффициент корреляции равен нулю, то это означает, что между x и y не существует линейной связи, но между ними может существовать зависимость, отличная от линейной.

Криволинейная корреляция

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

где y- экспериментальные значения,

Y — теоретические значения,

— среднее значение y.

Индекс корреляции по своему абсолютному значению колеблется в пределах от 0 до 1. При функциональной зависимости индекс корреляции равен 1. При отсутствии связи R = 0. Если коэффициент корреляции r является мерой тесноты связи только для линейной формы связи, то индекс корреляции R — и для линейной, и для криволинейной. При прямолинейной связи коэффициент корреляции по своей абсолютной величине равен индексу корреляции:.

3. Блок-схема алгоритма

Рисунок 3. Блок схема нахождения коэффициента корреляции

Рисунок 4. Блок-схема нахождения индекса корреляции

Рисунок 5. Блок-схема нахождения коэффициентов для метода наименьших квадратов

Рисунок 6. Блок-схема главной функции часть 1

Рисунок 7. Блок-схема главной функции часть 2

4. Описание программы

4.1 Описание алгоритма программы

1) Начало программы

2) Выбор способа ввода данных

3) Открытие файла для чтенияaium225m4. txt

4) Формирование массивов исходных данных

5) Закрытие файла aium225m4. txt

6) Вызов функции MASS для определения коэффициентов при коэффициенте нагрузки в=1

7) Вызов функции MASS для определения коэффициентов при коэффициенте нагрузки в=1,3

8) Расчет потерь меди ротора при разных напряжениях для коэффициента нагрузки в=1

9) Расчет потерь меди ротора при разных напряжениях для коэффициента нагрузки в=1,3

10) Нахождение суммарной квадратичной ошибки для коэффициентов нагрузки в=1,в=1,3

11) Расчет средней ошибки для коэффициентов нагрузки в=1,в=1,3

12) Нахождения относительной ошибки для коэффициентов нагрузки в=1,в=1,3

13) Определение коэффициента корреляции и индекса корреляции для коэффициентов нагрузки в=1,в=1,3 при помощи функции kof_korи Ind_kor

14) Запись в файл result. txt

15) Завершение программы

4.2 Описание выполнения программы

линейный математический промежуточный корреляция

В начале выполнения программы перед пользователем появляется меню выбора способа ввода данных в программу. В данной программе предусмотрено 2 варианта ввода данных — с клавиатуры или из текстового файла. После чего выполняется формирование массивов с исходными данными. Далее выполняется вызов функции для расчетов коэффициентов для метода наименьших квадратов при разных коэффициентах нагрузки, в которую передаются массивы исходных данных и размерность этих массивов, а также пустой массив коэффициентов, чтобы при помощи указателей вытащить эти значение из функции в главную программу. Далее происходит расчет значений функции для массива точек. Высчитываются соответствующие коэффициенты, и вычисляется значение функции в данной точке для разных коэффициентов нагрузки. Далее высчитывается суммарная квадратичная ошибка, средняя ошибка и относительная ошибка для обеих нагрузок. Затем вызываем функцию для определения коэффициента и индекса корреляции для разных коэффициентов нагрузок. После чего открывается файл result. txt, в который записываются результаты выполнения программы и программа завершается. Описание Функции

Функция MASS (double *x, double *y, double **sum, intN, intK, double *a, double *b) служит для вычисления коэффициентов для метода наименьших квадратов, где *x,*y массивы исходных данных, N — размерность массива, *а-искомый коэффициент.

Функция Kof_kor (double *x, double *y, intn) служит для вычисления коэффициента корреляции *x,*y-массив исходных данных, n — размерность массива.

Функция Ind_kor (double *a, double *x, double *y, intn) служит для вычисления индекса корреляции, где *a-коэффициентов метода наименьших квадратов, *x,*y-массивы исходных данных, n- размерность массивов.

5. Характеристика данных и их условные обозначения

Таблица 2

Наименование данных

Обозначение в блок-схеме

Обозначение в программе

Тип переменных

Размерность массива

n

n

int

Исходный массив значений нагрузок

x, x1

x, x1

double

Исходный массив значений напряжений

y, y1

y, y1

double

Вспомогательные переменные

i, k

i, k

int

Массив значения нагрузок, при котором необходимо определить значение напряжения

s

s

double

Ожидаемое значение нагрузки

otv, otv1

otv, otv1

double

Переменная выбора действия

j

j

int

Чтение данных из файла

f

f

ifstream

Запись данных в файл

f1

f1

ofstream

Коэффициент наименьших квадратов

a, a1

a, a1

double

Коэффициент корреляции

kof_kor

kof_kor

double

Индекс корреляции

Ind_kor

Ind_kor

double

Суммарная квадратичная ошибка

S, S1

S, S1

double

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

#include < iostream>

#include < fstream>

#include < math. h>

#include < conio. h>

#include < clocale>

using namespace std;

int MASS (double *x, double *y, double **sum, int N, int K, double *a, double *b)

{ int i, j, k, m; double z, c;

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

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

{

sum[i][j]=0;

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

{sum[i][j]+=pow (x[k], i+j); }

}

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

{b[i]=0;

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

{b[i]+=pow (x[k], i)*y[k]; }

}

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

{m=i;

for (j=i+1; j<K+1;j++)

{if (fabs (sum[m][i])< fabs (sum[j][i])) m=j; }

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

{z=sum[m][k]; sum[m][k]=sum[i][k];sum[i][k]=z;}

z=b[m]; b[m]=b[i];b[i]=z;

for (j=i+1; j<K+1;j++)

{

c=-sum[j][i]/sum[i][i];

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

{sum[j][k]=sum[j][k]+c*sum[i][k]; }

b[j]=b[j]+c*b[i]; }

}

a[K]=b[K]/sum[K][K];

for (i=K+1−2; i>= 0; i--)

{

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

{b[i]=b[i]-a[k]*sum[i][k]; }

a[i]=b[i]/sum[i][i];

}

return 0;

}

double Kof_kor (double *x, double *y, int n)

{int i;

double sred_x, sred_y, kof_kor, sum_x=0,sum_y=0,*otkl_x,*otkl_y, sum_otkl_x, sum_otkl_y;

double *proizv_rz, stand_otklon_x, stand_otklon_y,*otkl_x2,*otkl_y2,sum_proizv_rz=0;

otkl_x=new double [n]; otkl_y=new double [n]; proizv_rz=new double [n]; otkl_x2=new double [n]; otkl_y2=new double [n];

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

{sum_x+=x[i]; sum_y+=y[i];}

sred_x=sum_x/n; sred_y=sum_y/n;

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

{otkl_x[i]=sred_x-x[i]; otkl_y[i]=sred_y-y[i];}

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

{otkl_x2[i]=pow (otkl_x[i], 2); otkl_y2[i]=pow (otkl_y[i], 2);}

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

{sum_otkl_x+=otkl_x2[i]; sum_otkl_y+=otkl_y2[i];}

stand_otklon_x=pow (sum_otkl_x/n,½.);stand_otklon_y=pow (sum_otkl_y/n,½.);

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

{proizv_rz[i]=otkl_x[i]*otkl_y[i]; }

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

{sum_proizv_rz+=proizv_rz[i]; }

kof_kor=sum_proizv_rz/(stand_otklon_x*stand_otklon_y*n);

return kof_kor;

}

double Ind_kor (double *a, double *x, double *y, int n)

{int i;

double sred_y,*yY,*yM, Y, ym=0,yy=0,ind_kor;

yY=new double [n]; yM=new double [n];

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

{sred_y+=y[i]; }

sred_y=sred_y/n;

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

{

Y=a[0]+a[1]*x[i]+a[2]*pow (x[i], 2)+a[3]*pow (x[i], 3);

yY[i]=pow (y[i]-Y, 2); yM[i]=pow (y[i]-sred_y, 2);

}

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

{yy+=yY[i]; ym+=yM[i];}

ind_kor=pow (fabs (1-(yy/ym)),½.);

return ind_kor;

}

int main ()

{

ifstream f; ofstream f1;

int n=6,k, N=4,i, j=1,n1=3; double **x_mass,*y,*x,*s,*a,*b,*y1,*x1,*a1,*otv,*otv1,kof_kor, ind_kor,*min_y,*min_y1,S=0,S1=0,OTVET;

double sred_y,*yY,*yM, Y, ym=0,yy=0; yY=new double [n]; yM=new double [n];

x=new double [n]; y=new double [n]; a=new double [N]; a1=new double [N]; b=new double [N]; min_y=new double [n]; min_y1=new double [n];

x1=new double [n]; y1=new double [n];

s=new double [n1]; otv=new double [n1]; otv1=new double [n1];

x_mass=new double *[N];

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

x_mass[i]=new double [N];

setlocale (LC_CTYPE, ««);

cout< <"Выберитеспособвводаданных"<<endl;

cout< <"1)Для считывания с файла нажмите 1"< <endl;

cout< <"2)Для ввода с клавиатуры 2 «; cin>>j;

if (j==1)

{

f. open («C:\Users\user\Desktop\aium225m4. txt»);

cout< <"Значение напряжения «< <endl;

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

{f> >s[i];cout<<s[i]<<"t";}

cout< <endl;f>>n;

cout< <"Размерность--«<<n<<endl;

cout< <"Для коэффициентов нагрузки Beta=1"< <endl;

cout< <"Массив напряжения"< <endl;

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

{f> >x[i];cout<<x[i]<<"t";}

cout< <endl;

cout< <"Массивтокаротора"<<endl;

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

{f> >y[i];cout<<y[i]<<"t";}

cout< <endl;

cout< <"Длякоэффициентовнагрузки Beta=1. 3"<<endl;

cout< <"Массив напряжения"< <endl;

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

{f> >x1[i];cout<<x1[i]<<"t";}

cout< <endl;

cout< <"Массивтокротора"<<endl;

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

{f> >y1[i];cout<<y1[i]<<"t";}

cout< <endl;

f. close ();

}

else

{

cout< <" Значение напряжения «< <endl;

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

{cin> >s[i];}

cout< <endl;

cout< <" Введите размерность: «; cin>>n;

cout< <"Для коэффициентов нагрузки Beta=1"< <endl;

cout< <"Массив напряжения"< <endl;

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

{cin> >x[i];}

cout< <endl;

cout< <"Массив тока ротора"< <endl;

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

{cin> >y[i];}

cout< <endl;

cout< <"Длякоэффициентовнагрузки Beta=1. 3"<<endl;

cout< <"Массив напряжения"< <endl;

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

{cin> >x1[i];}

cout< <endl;

cout< <"Массив тока ротора"< <endl;

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

{cin> >y1[i];}

cout< <endl;

}

MASS (x, y, x_mass, n, n1,a, b);

MASS (x1,y1,x_mass, n, n1,a1,b);

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

{otv[i]=a[0]+a[1]*s[i]+a[2]*pow (s[i], 2)+a[3]*pow (s[i], 3); }

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

{otv1[i]=a1[0]+a1[1]*s[i]+a1[2]*pow (s[i], 2)+a1[3]*pow (s[i], 3); }

f1. open («C:\Users\user\Desktop\rezult. txt»);

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

{min_y[i]=a[0]+a[1]*x[i]+a[2]*pow (x[i], 2)+a[3]*pow (x[i], 3);

min_y1[i]=a1[0]+a1[1]*x1[i]+a1[2]*pow (x1[i], 2)+a1[3]*pow (x1[i], 3); }

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

{S+=pow (min_y[i]-y[i], 2); S1+=pow (min_y1[i]-y1[i], 2);}

cout< <"Длякоэффициентовнагрузки Beta=1"< <endl;f1<<" Длякоэффициентовнагрузки Beta=1"< <endl;

cout< <"Выводкоэффициентов A"< <endl;f1<<" Выводкоэффициентов A"< <endl;

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

{cout< <a[i]<<"t";f1<<a[i]<<"t";}

cout< <endl;f1<<endl;

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

{cout< <"При напряжении «< <s[i]<<» тока ротора составляет «< <otv[i]<<endl;f1<<» При напряжении «< <s[i]<<» тока ротора составляет «< <otv[i]<<endl;}

cout< <"Суммарная квадратичная ошибка: «<<S<<endl;f1<<» Суммарная квадратичная ошибка: «<<S<<endl;

cout< <"Средняя ошибка: «<<S/n<<endl;f1<<» Средняя ошибка: «<<S/n<<endl;

cout< <"Относительная ошибка: «<<pow (S, 1. /n)<<endl;f1<<» Относительная ошибка: «<<pow (S, 1. /n)<<endl;

kof_kor=Kof_kor (x, y, n);

cout< <"Коэффициенткорреляцииравен «< <kof_kor<<endl;f1<<"Коэффициенткорреляцииравен"<<kof_kor<<endl;

ind_kor=Ind_kor (a, x, y, n);

cout< <"Индекскорреляцииравен «< <ind_kor<<endl;f1<<"Индекскорреляцииравен"<<ind_kor<<endl;

cout< <"Узловые точки"< <endl;f1<<" Узловые точки «< <endl;

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

{

OTVET=a[0]+a[1]*x[i]+a[2]*pow (x[i], 2)+a[3]*pow (x[i], 3);

cout< <"X["<<i<<"]="<<x[i]<<"t Y["< <i<<"]="<<y[i]<<"t Y1["< <i<<"]="<<OTVET<<endl;

f1< <"X["<<i<<"]="<<x[i]<<"t Y["< <i<<"]="<<y[i]<<"t Y["< <i<<"]="<<OTVET<<endl;}

cout< <endl;f1<<endl;

cout< <"Длякоэффициентовнагрузки Beta=1. 3"<<endl;f1<<"ДлякоэффициентовнагрузкиBeta=1. 3"<<endl;

cout< <"Выводкоэффициента A"< <endl;f1<<"ВыводкоэффициентаA"<<endl;

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

{cout< <a1[i]<<"t";f1<<a1[i]<<"t";}

cout< <endl;f1<<endl;

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

{cout< <"При напряжении «< <s[i]<<» ток ротора составляет"< <otv1[i]<<endl;f1<<" При напряжении «< <s[i]<<» ток ротора составляет «< <otv1[i]<<endl;}

cout< <"Суммарная квадратичная ошибка: «<<S1<<endl;f1<<» Суммарная квадратичная ошибка: «<<S1<<endl;

cout< <"Средняя ошибка: «<<S1/n<<endl;f1<<» Средняя ошибка: «<<S1/n<<endl;

cout< <"Относительная ошибка: «<<pow (S1,1. /n)<<endl;f1<<» Относительная ошибка: «<<pow (S1,1. /n)<<endl;

kof_kor=Kof_kor (x1,y1,n);

cout< <"Коэффициенткорреляцииравен «< <kof_kor<<endl;f1<<"Коэффициенткорреляцииравенн «< <kof_kor<<endl;

ind_kor=Ind_kor (a1,x1,y1,n);

cout< <"Индекскорреляцииравен «< <ind_kor<<endl;f1<<"Индекскорреляцииравен"<<ind_kor<<endl;

cout< <"Узловые точки"< <endl;f1<<" Узловые точки «< <endl;

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

OTVET=a[0]+a[1]*x1[i]+a[2]*pow (x1[i], 2)+a[3]*pow (x1[i], 3);

cout< <"X["<<i<<"]="<<x1[i]<<"t Y["< <i<<"]="<<y1[i]<<"t Y1["< <i<<"]="<<OTVET<<endl;

f1< <"X["<<i<<"]="<<x1[i]<<"t Y["< <i<<"]="<<y1[i]<<"t Y1["< <i<<"]="<<OTVET<<endl;}

return 0;

7. Контрольный пример

Метод наименьших квадратов

При коэффициенте нагрузки в=1

Рисунок 8.1 Проверка в MathCadпри коэффициенте нагрузки в=1

Рисунок 8.2 Проверка в MathCadпри коэффициенте нагрузки в=1

При коэффициенте нагрузкив=1. 3

Рисунок 9. 1Проверка в MathCadпри коэффициенте нагрузки в=1,3

Рисунок 9. 2Проверка в MathCad при коэффициенте нагрузки в=1,3

8. Анализ результатов

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

Наименования значений

В С++

В MathCad

Коэффициент нагрузкив=1

f (0. 72)

1. 514

1. 5138

f (0. 91)

0. 984

0. 983 698

f (1. 23)

0. 763

0. 763 355

Коэффициент нагрузкив=1. 3

f (0. 72)

2. 245

2. 24 513

f (0. 91)

1. 484

1. 33 642

f (1. 23)

1. 039

1. 3 936

Сравнивая результаты расчета созданной программы с контрольным расчетом, можно сказать, что погрешность очень мала. Вероятней всего разницу вызвало округление в Mathcad и С++. Следовательно, алгоритм, который был разработан для выполнения данной задачи составлен верно.

Заключение

В данной курсовой работе было изучено и проведено вычисление значения функции в заданных промежуточных точках использование математических пакетов для проверки полученных в ходе работы результатов. В качестве инструментов для решения поставленной задачи были использованы язык программирования С++, математический пакет Mathcad.

Список литературы

1. 1. Алексеев Е. Р., Чеснокова О. В. Решение задач вычислительной математики в пакетах Mathcad12, MATLAB 7, Maple 9. М.: Н Т Пресс, 2006. — 496 с.

2. Алексеев Е. Р., Чеснокова О. В. Самоучитель по программированию на C/C++. — Донецк.: ДонНТУ, 2013. — 289 с.

Приложение

Рисунок 10. Выполнение программы. Ввод данных с клавиатуры

Рисунок 11. Выполнение программы. Ввод данных из текстового файла

Рисунок 12. Файл с исходными данными

Рисунок 13. Файл с результатом проведенных вычислений

ПоказатьСвернуть
Заполнить форму текущей работой