Автор работы: Пользователь скрыл имя, 04 Марта 2015 в 19:33, курсовая работа
В данной работе приводится решение задачи, которая заключается в аналитическом представлении искомой функциональной зависимости, т.е. в подборе формулы, описывающей результаты эксперимента, с помощью табличного редактора MS Excel и языка программирования Turbo Pascal v.7.0.
Введение. - 6 -
1. Получение физических зависимостей при обработке результатов эксперимента методом наименьших квадратов - 7 -
1.1. Постановка и математическая модель задачи - 7 -
1.1.1. Содержательная формулировка задачи - 7 -
1.1.2. Исходные данные (задача №1) - 7 -
1.1.3. Расчетные формулы - 8 -
1.2. Разработка алгоритма решения задачи - 11 -
1.2.1. Укрупненный алгоритм и его описание - 11 -
1.2.2. Детали алгоритма и их описание - 12 -
2. Программирование - 14 -
2.1. Описание используемых переменных, массивов - 14 -
2.2. Файловый ввод-вывод данных - 14 -
2.3. Пояснения к циклам - 15 -
2.4. Соответствие между блок-схемой и программой - 15 -
2.5. Текст программы на языке Turbo Pascal v.7.0 - 16 -
2.7. Результаты выполнения программы и их анализ - 20 -
3. Построение эмпирических формул средствами Microsoft Excel. - 21 -
3.1. Аппроксимация функции у=f(x) линейной функцией. - 22 -
3.2. Аппроксимация функции у=f(x) квадратичной функцией. - 22 -
3.3. Аппроксимация функции у=f(x) степенной функцией. - 23 -
3.4. Аппроксимация функции у=f(x) экспоненциальной функцией. - 24 -
3.5. Вычисление коэффициентов детерминированности. - 25 -
3.4. Построение графиков зависимостей и линии тренда - 27 -
4. Сравнительный анализ результатов, полученных в Excel, с результатами, полученных при выполнении программы - 30 -
Библиографический список - 31 -
Такие матрицы лучше всего решать по формулам Крамера, т.к. достаточно легко можно сосчитать определители. Суть метода Крамера состоит в следующем:
Пусть нам даны следующие матрицы ( -матрица коэффициентов, - матрица свободных членов):
;
Допустим, что необходимо решить матричную систему уравнений
, где
Обозначим через - вспомогательных определителей, где - определитель матрицы, полученной из матрицы коэффициентов заменой её -ого столбца столбцом свободных членов.
Если -определитель матрицы , то справедливы следующие уравнения:
2. Программирование
2.1.
Описание используемых
При написании программы на языке программирования Pascal было использовано достаточно много различных переменных и массивов. Дадим им краткую характеристику.
Road_Input, Road_Output – Константы, содержащие пути к входному и выходному файлу.
N – Константа, которая хранит количество произведённых измерений физических величин.
File_Input, File_Output – Файловые переменные, необходимые для организации файлового ввода-вывода.
Matrix – Массив, содержащий исходную таблицу с данными.
Matrix_Teor – Массив, содержащий теоретические значения функции.
D – Главный определитель матрицы коэффициентов.
D1, D2, D3 – Вспомогательные определители матриц.
Koef_Lin – Массив, содержащий коэффициенты линейной аппроксимации.
Koef_Kvad – Массив, содержащий коэффициенты квадратичной аппроксимации.
Koef_Step – Массив, содержащий коэффициенты степенной аппроксимации.
Koef_Exp – Массив, содержащий коэффициенты экспоненциальной аппроксимации.
Q – Массив, содержащий значения отклонений эмпирических значений из исходной таблицы и теоретических значкний.
R – Массив, содержащий коэффициенты детерминированности.
Q_Min – Переменная, содержащая наименьшее значений Q.
I, j – Различные счётчики циклов.
Также в подпрограммах были использованы переменные, которые использовались в основном как счетчики циклов и как хранилища различных значений для подсчета тех или иных физических величин.
2.2. Файловый ввод-вывод данных
Для ввода данных в программу и для вывода полученных результатов используются текстовые типизированные файлы. Так файл Input.txt предназначен для ввода данных, а файл Output.txt для вывода полученных результатов.
2.3. Пояснения к циклам
В основном все циклы, использованные в программе предназначены либо для заполнения массивов исходными или теоретическими значениям, либо для организации последовательного суммирования элементов этих массивов.
2.4.
Соответствие между блок-
Основная блок-схема программы:
2.5. Текст программы на языке Turbo Pascal v.7.0
Program Kurs_Project;
Const
Road_Input='D:\Kurs\Input.txt'
Road_Output='D:\Kurs\Output.
n=25;
Var
File_Input,File_Output:Text;
Matrix:Array[1..2,1..n] of Real;
Matrix_Teor:Array[1..2,1..n] of Real;
d:Real;
d1,d2,d3:Real;
Koef_Lin:Array[1..2] of Real;
Koef_Kvad:Array[1..3] of Real;
Koef_Step:Array[1..2] of Real;
Koef_Exp:Array[1..2] of Real;
Q:Array[1..4] of Real;
R:Array[1..4] of Real;
Q_Min:Real; i,j:Byte;
{-------------Функция суммирования известных аргументов-------------------}
Function Summ(Key:String):Real;
Var i:Byte; S,K:Real;
Begin Function
S:=0;
If key='x' then
Begin
For i:=1 to n do S:=S + Matrix[1,i];
Summ:=S;
End
Else If key='y' then
Begin
For i:=1 to n do S:=S + Matrix[2,i];
Summ:=S;
End
Else If key='xy' then
Begin
For i:=1 to n do S:=S + Matrix[1,i]*Matrix[2,i];
Summ:=S;
End
Else if key='x^2' then
Begin
For i:=1 to n do S:=S + sqr(Matrix[1,i]);
Summ:=S;
End
Else if key='x^3' then
Begin
For i:=1 to n do S:=S + Matrix[1,i]*sqr(Matrix[1,i]);
Summ:=S;
End
Else if key='x^4' then
Begin
For i:=1 to n do S:=S + sqr(Matrix[1,i])*sqr(Matrix[1,
Summ:=S;
End
Else if key='x^2y' then
Begin
For i:=1 to n do S:=S + sqr(Matrix[1,i])*Matrix[2,i];
Summ:=S;
End
Else if key='lnx' then
Begin
For i:=1 to n do S:=S + ln(Matrix[1,i]);
Summ:=S;
End
Else if key='lny' then
Begin
For i:=1 to n do S:=S + ln(Matrix[2,i]);
Summ:=S;
End
Else if key='lnx^2' then
Begin
For i:=1 to n do S:=S + ln(sqr(Matrix[1,i]));
Summ:=S;
End
Else if key='lnxy' then
Begin
For i:=1 to n do S:=S + ln(Matrix[1,i]*Matrix[2,i]);
Summ:=S;
End
Else if key='xlny' then
Begin
For i:=1 to n do S:=S + Matrix[1,i]*ln(Matrix[2,i]);
Summ:=S;
End;
End; Function
{------------------
Function Znach_Q:Real;
Var Q:Real;
Begin
Q:=0;
For i:=1 to n do
Begin
Q:=Q + sqr(Matrix_Teor[2,i]-Matrix[2,
End;
Znach_Q:=Q;
End;
{-------------------
Function Znach_R:Real;
Var
Chislo1,Chislo2,Sred_y:Real;
Begin
Chislo1:=0;Chislo2:=0;
Sred_y:=0;
For i:=1 to n do
Begin
Sred_y:=Sred_y + Matrix_Teor[2,i];
End;
Sred_y:=Sred_y/n;
For i:=1 to n do
Begin
Chislo1:=Chislo1 + sqr(Matrix_Teor[2,i]-Matrix[2,
Chislo2:=Chislo2 + sqr(Matrix[2,i]-Sred_y);
End;
Znach_R:=1-Chislo1/Chislo2;
End;
Begin
{------------------Чтение
из файла-------------------------
Assign(File_Input,Road_Input);
Reset(File_Input); i:=1;
Readln(File_Input); Пропуск строки в файле While not EOF(File_Input) do
Begin While
Read(File_Input,Matrix[1,i]); Readln(File_Input,Matrix[2,i])
End; While
Close(File_Input);
For i:=1 to n do Matrix_Teor[1,i]:=Matrix[1,i];
{-------------------Проверка линейной зависимости-------------------
d:=n*Summ('x^2')-Summ('x')*
d1:=Summ('y')*Summ('x^2')-
d2:=n*Summ('xy')-Summ('x')*
Koef_Lin[1]:=d1/d;
Koef_Lin[2]:=d2/d;
For i:=1 to n do
Begin
Matrix_Teor[2,i]:=Koef_Lin[1]+
End;
Q[1]:=Znach_Q;
R[1]:=Znach_R;
{-------------------Проверка квадратичной зависимости-------------------
d:=n*Summ('x^2')*Summ('x^4')+
Summ('x^2')*Summ('x')*Summ('x^
Summ('x^3')*Summ('x^3')*n-
d1:=Summ('y')*Summ('x^2')*
Summ('x^2')*Summ('xy')*Summ('
Summ('x^3')*Summ('x^3')*Summ('
d2:=n*Summ('xy')*Summ('x^4')+
Summ('x^2')*Summ('x')*Summ('x^
Summ('x^2y')*Summ('x^3')*n-
d3:=n*Summ('x^2')*Summ('x^2y')
Summ('y')*Summ('x')*Summ('x^3'
Summ('x^3')*Summ('xy')*n-Summ(
Koef_Kvad[1]:=d1/d;
Koef_Kvad[2]:=d2/d;
Koef_Kvad[3]:=d3/d;
For i:=1 to n do
Begin
Matrix_Teor[2,i]:=Koef_Kvad[1]
Koef_Kvad[3]*sqr(Matrix_Teor[
End;
Q[2]:=Znach_Q;
R[2]:=Znach_R;
{---------------------Проверка степенной зависимости-------------------
d:=n*Summ('lnx^2')-Summ('lnx')
d1:=Summ('lny')*Summ('lnx^2')-
d2:=n*Summ('lnxy')-Summ('lnx')
Koef_Step[1]:=exp(d1/d);
Koef_Step[2]:=d2/d;
For i:=1 to n do
Begin
Matrix_Teor[2,i]:=Koef_Step[1]
Q[3]:=Znach_Q;
R[3]:=Znach_R;
{---------------------Проверка экспоненциальной зависимости-----------------}
d:=n*Summ('x^2')-Summ('x')*
d1:=Summ('lny')*Summ('x^2')-
d2:=n*Summ('xlny')-Summ('x')*
Koef_exp[1]:=exp(d1/d);
Koef_exp[2]:=d2/d;
For i:=1 to n do
Begin
Matrix_Teor[2,i]:=Koef_exp[1]*
End;
Q[4]:=Znach_Q;
R[4]:=Znach_R;
{-------------Анализ значений Q-----------------------------
Q_Min:=Q[1]; j:=1;
For i:=2 to 4 do
If Q[i] < Q_Min then
Begin
Q_Min:=Q[i]; j:=i;
End;
{----------------Вывод полученных
результатов-------------------
Assign(File_Output,Road_
Rewrite(File_Output);
Writeln(File_Output,'
Writeln(File_Output);
Writeln(File_Output,'1) Линейная зависимость');
Writeln(File_Output,'y=',Koef_
'Q=',Q[1]:5:3,' ; ','R=',R[1]:5:3);
Writeln(File_Output);
Writeln(File_Output,'2) Квадратичная зависимость');
Writeln(File_Output,'y=',Koef_
Koef_Kvad[3]:5:3,'*x^2 ; ','Q=',Q[2]:5:3,' ; ','R=',R[2]:5:3); Writeln(File_Output);
Writeln(File_Output,'3) Степенная зависимость');
Writeln(File_Output,'y=',Koef_
'Q=',Q[3]:5:3,' ; ','R=',R[3]:5:3);
Writeln(File_Output);
Writeln(File_Output,'4) Экспоненциальная зависимость');
Writeln(File_Output,'y=',Koef_
'Q=',Q[4]:5:3,' ; ','R=',R[4]:5:3);
Writeln(File_Output);
Writeln(File_Output);
Writeln(File_Output,'Наиболее
Case j of
1:Begin
Writeln(File_Output,'Линейная зависимость'); Writeln(File_Output,'Q=',Q_
End;
2:Begin
Writeln(File_Output,'
End;
3:Begin
Writeln(File_Output,'Степенная зависимость');
Writeln(File_Output,'Q=',Q_
End;
4:Begin
Writeln(File_Output,'
End;
End;
Close(File_Output);
End.
2.7.
Результаты выполнения
Для отладки программы воспользуемся исходными значениями.
Файл Input.txt
x y
2.1 3.7
2.7 4.2
3.1 4.4
3.6 4.9
4.2 5.3
4.7 5.6
5.2 6.1
5.6 6.4
6.2 6.7
6.6 7.0
7.2 7.3
7.6 7.4
8.1 7.9
8.7 8.1
9.0 8.3
9.6 8.7
10.1 8.9
10.6 9.1
11.1 9.4
11.6 9.7
12.0 9.7
12.7 10.1
13.1 10.2
13.7 10.6
14.7 11.0
Файл Output.txt
Теоретическая Функциональная зависимость y от x
1) Линейная зависимость
y=2.943+0.575*x ; Q=1.223 ; R=0.989
2) Квадратичная зависимость
y=2.014+0.855*x+-0.017*x^2 ; Q=0.127 ; R=0.999
3) Степенная зависимость
y=1.743*x^(0.726) ; Q=8.791 ; R=0.921
4) Экспоненциальная зависимость
Наиболее точная зависимость:
Квадратичная зависимость
Q=0.127
3. Построение
эмпирических формул
Для проведения расчётов данные целесообразно расположить в виде таблицы (рис.1), используя средства табличного процессора Microsoft Excel.
Поясним, как составлялась таблица (рис.1)
1) В ячейки A2:A26 заносим значения ;
2) В ячейки B2:B26 заносим значения ;
3) В ячейку C2 вводим формулу =A2^2 и копируем её в ячейки C3:C26;
4) В ячейку D2 вводим формулу =A2*B2 и копируем её в ячейки D3:D26;
5) В ячейку E2 вводим формулу =A2^3 и копируем её в ячейки E3:E26;
6) В ячейку F2 вводим формулу =A2^4 и копируем её в ячейки F2:F26;
7) В ячейку G2 вводим формулу =(A2^2)*B2 и копируем её в ячейки G3:G26;
8) В ячейку H2 вводим формулу =LN(B2) и копируемеё в ячейки H3:H26;
9) В ячейку I2 вводим формулу =LN(A2) и копируем её в ячейки I3:I26;
10) В ячейку J2 вводим формулу =LN(A2^2) и копируем её в ячейки J3:J26;
11) В ячейку K2 вводим формулу =LN(A2*B2) и копируем её в ячейки K3:K26;
12) В ячейку L2 вводим формулу =A2*LN(B2) и копируем её в ячейки L3:L26;
13) В ячейку A28 вводим формулу =СУММ(A2:A26) и копируем её в ячейки B28:L28;
3.1. Аппроксимация функции у=f(x) линейной функцией.
Аппроксимируем функцию линейной функцией . Для определения коэффициентов и воспользуемся системой (4). Используя итоговые суммы таблицы, расположенные в ячейках A28, B28, C28 и D28, вычислим значение коэффициентов (рис.2 и рис.3).
3.2. Аппроксимация функции у=f(x) квадратичной функцией.
Далее аппроксимируем функцию квадратичной функцией . Для определения коэффициентов a1, a2 и a3 воспользуемся системой (5). Используя итоговые суммы таблицы, расположенные в ячейках A28, B28, C28 , D28, E28, F28, G28 вычислим значение коэффициентов (рис.4 и рис.5).
3.3. Аппроксимация функции у=f(x) степенной функцией.
Аппроксимируем функцию степенной функцией . Для определения коэффициентов и воспользуемся системой (4), в которую вместо входят значения . Используя итоговые суммы таблицы, расположенные в ячейках H28, I28, J28 и K28, вычислим значение коэффициентов (рис.6 и рис.7).
3.4. Аппроксимация функции у=f(x) экспоненциальной функцией.
Аппроксимируем функцию экспоненциальной функцией . Для определения коэффициентов и воспользуемся системой (4), в которую вместо входят значения . Используя итоговые суммы таблицы, расположенные в ячейках А28, С28, H28 и L28, вычислим значение коэффициентов (рис.8 и рис.9).
3.5.
Вычисление коэффициентов
Таблица (рис.10) содержит теоретическую функциональную зависимость для каждой функции, заданной таблично.
В таблице (рис.10) значения в столбцах P,Q,R и S получили, подставляя из начальных данных в эмпирические формулы со своими коэффициентами, которые были вычислены ранее для разных зависимостей.
Поясним, как составлялась эта таблица:
1) В ячейку P4 вводим формулу =$E$36+N4*$E$37 и копируем её в ячейки P5:P28;
2) В ячейку Q4 вводим формулу =$F$46+N4*$F$47+N4*N4*$F$48 и копируем её в ячейки Q5:Q28;
3) В ячейку R4 вводим формулу =$E$60*N4^$E$61 и копируем её в ячейки R5:R28;
4) В ячейку S4 вводим формулу =$E$73*EXP($E$74*N4) и копируем её в ячейки S5:S28;
Чтобы посчитать средние значения в ячейку P30 вводим формулу =СУММ(P4:P28)/25 и копируем её в ячейки Q30:S30;
Далее приведём таблицу значений (рис.11) параметров, которые потребуются для расчётов коэффициентов детерминированности.
Поясним, как составлялась эта таблица:
1) В ячейку T4 вводим формулу =(P4-$O4)^2 и копируем её в ячейки T4:W28;
2) В ячейку X4 вводим формулу =($O4-P$30)^2 и копируем её в ячейки X4:AA28;
3) В ячейку T30 вводим формулу =СУММ(T4:T28) и копируем её в ячейки U30:AA30;