Министерство образования и науки Российской Федерации |
||
федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Балтийский государственный технический университет «ВОЕНМЕХ» им. Д.Ф. Устинова» (БГТУ «ВОЕНМЕХ» им. Д.Ф. Устинова») |
||
Стандарт организации |
||
БГТУ.СМК-П-4.2-12 |
ПОЛОЖЕНИЕ ПО СОДЕРЖАНИЮ, ОФОРМЛЕНИЮ, ОРГАНИЗАИИ ВЫПОЛНЕНИЯ И ЗАЩИТЫ КУРСОВЫХ ПРОЕКТОВ И КУРСОВЫХ РАБОТ |
Должность |
Фамилия/ Подпись |
Дата |
|||
Разработал |
Начальник ОКО |
Соловьева Н.Л. |
|||
Согласовал |
Первый проректор-проректор по образовательной деятельности |
Бородавкин В.А. |
|||
Версия:2.0 |
КЭ:_________ |
УЭ №________ |
Стр. 1 из 20 |
КУРСОВАЯ РАБОТА
на тему
Использование языков программирования высокого уровня для решения задач вычислительной математики
Содержание
Введение
Постановка задачи: реализовать задачу вычислительной математики на двух языках программирования - Pascal и Си
Несмотря на простоту представленной математической задачи, она может служить прекрасным примером для обучения структурному программированию.
Структурное программирование основывается на 3-х основных составляющих:
1) Использование трех базовых структур - следования, ветвления и циклов
2) Модульное программирование (использования большого количества подпрограмм и модулей для разбития более сложной задачи на ряд простейших)
3) Нисходящее программирование - создание сначала основной функции, а потом последовательное присоединение к ней подпрограмм, стоящих по иерархии ниже по уровню.
В этой работе мы будем использовать все три составляющие - как разобьем программу на множество подпрограмм, так и будем использовать нисходящее программирование, для того чтобы улучшить согласованность подпрограмм между собой. Это позволит нам решить поставленную математическую задачу наиболее эффективно.
Постановка задачи
Найти значение интеграла , пользуясь методом трапеций, методом Симпсона и методом Ньютона для различных n (n=6, 12, 30). Сравнить с точным значением интеграла и оценить погрешности методов при указанных n. Изобразить график подынтегральной функции и заштриховать область, площадь которой равна значению интеграла.
Описание курсовой работы
Курсовая работа выполнена с учетом требований технологии структурного программирования. Программа предусматривает возможность ввода исходных данных с клавиатуры и чтение из файла, также программа осуществляет вывод результатов на экран и запись в файл. Диалоговое взаимодействие пользователя с программой реализуется через систему меню, что предоставляет пользователю последовательно выполнять различные действия.
1. Методы численного интегрирования, использующиеся в этой курсовой работе
Эти методы применяются для приближенного вычисления определенного интеграла вида: . Функция f(x) задана на отрезке [a, b]. Этот отрезок разбивается на n равных частей длины h=(b-a)/n.
Определенный интеграл представляет собой площадь, ограниченную кривой f(x), осью x и прямыми x=a и x=b. Приблизительно эта площадь представляется суммой площадей полос, основания которых одинаковы и равны h, а высоты равны значениям функции в точках разбиения. Обозначим точки разбиения x0=a, x1=a+h, x2= a+2h,…xn=b, а значения функции в этих точках соответственно yo=f(x0); y1=f(x1), y2=f(x2), … yn=f(xn).
Метод трапеций:
Метод Симпсона:
гдеn=2*m число разбиений отрезка [a, b], кратное двум.
Метод Ньютона:
гдеn=m*3- число разбиений отрезка [a, b], кратное трем
2. Решение задания на языке высокого уровня С
Листинг программы
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define a -1
#define b 1
#define I 2.350402
int N;
void menu();
float y(float x);
intget_n();
float Simpson();
float Trap();
floatNewton();
intconsole_n();
intfile_n();
void output(float f, inti);
void console_I(float f, inti);
void file_i(float f, inti);
int main()
{
menu();
return 0;
}
void menu()
{
printf('n %3.dn', b);
printf(' I = S(e^x)dxn');
printf(' %1.dnn', a);
printf('1. Solve by Simpsonn2. Solve by trapezen3. Solve by Newtonn4. Exitn>> ');
int c;
float f;
scanf('%d', &c);
switch (c)
{
case 1 :
{
system('cls');
f = Simpson();
break;
}
case 2 :
{
system('cls');
f = Trap();
break;
}
case 3 :
{
system('cls');
f = Newton();
break;
}
case 4 :
{
system('cls');
exit(1);
break;
}
default :
{
system('cls');
menu();
}
}
output(f, c);
printf('Push any button to return to menu...');
getch();
system('cls');
menu();
}
void console_I(float f, inti)
{
system('cls');
if (i == 1)
printf('Solved by Simpson method: n = %dn', N);
else if (i == 2)
printf('Solved by trapeze method: n = %dn', N);
else
printf('Solved by Newton method: n = %dn', N);
printf('n %3.dn', b);
printf(' I = S(e^x)dx = %fn', f);
printf(' %1.dnn', a);
printf('Exact value: %fn', I);
printf('Difference: %fn', I - f);
}
void file_I(float f, inti)
{
FILE *t;
t = fopen('C:/Documents and Settings/User/Рабочийстол/Прога/Курсач/output_f.txt', 'w');
if (i == 1)
fprintf(t, 'Solved by Simpson method: n = %dn', N);
else if (i == 2)
fprintf(t, 'Solved by trapeze method: n = %dn', N);
else
fprintf(t, 'Solved by Newton method: n = %dn', N);
fprintf(t, 'n %3.dn', b);
fprintf(t, ' I = S(e^x)dx = %fn', f);
fprintf(t, ' %1.dnn', a);
fprintf(t, 'Exact value: %fn', I);
fprintf(t, 'Difference: %fn', I - f);
fclose(t);
}
void output(float f, inti)
{
int c;
printf('Output I:n1. Filen2. Consolen3. File&Consolen>> ');
scanf('%d', &c);
if (c == 1)
file_I(f, i);
else if (c == 2)
console_I(f, i);
else
{
console_I(f, i);
file_I(f, i);
}
}
float y(float x)
{
return expf(x);
}
intget_n()
{
int n, c;
printf('Input n:n1. From filen2. From consolen>> ');
scanf('%d', &c);
if (c == 1)
n = file_n();
else
n = console_n();
N = n;
return n;
}
intconsole_n()
{
system('cls');
int n;
printf('Enter n: ');
scanf('%d', &n);
return n;
}
intfile_n()
{
FILE *f;
int n;
f = fopen('C:/Documents and Settings/User/Рабочийстол/Прога/Курсач/input_n.txt', 'r');
fscanf(f, '%d', &n);
fclose(f);
return n;
}
float Simpson()
{
float n;
n = get_n();
float h = (b - a) / n, sum = 0;
inti, p;
for (i = 1; i< n; i++)
{
if ((int)i % 2 == 0)
p = 2;
else
p = 4;
sum += p*y(a + h * i);
}
sum += y(a) + y(b);
sum *= (h/3);
return sum;
}
float Trap()
{
float n;
n = get_n();
float h = (b - a) / n, sum = 0;
inti;
for (i = 0; i< n; i++)
sum += y(a + i * h) + y(a + (i + 1) * h);
sum *= h / 2;
return sum;
}
float Newton()
{
float n;
n = get_n();
float h = (b - a) / n, sum1 = 0, sum2 = 0, sum;
inti;
for (i = 1; i< n; i++)
if ((int)i % 3 == 0)
sum1 += y(a + i * h);
else
sum2 += y(a + i * h);
sum = 3.0 / 8 * h * (y(a) + y(b) + 2 * sum1 + 3 * sum2);
returnsum;
}
Тестирование
Предварительно вычислив данный интеграл, мы имеем некое точное значение, с которым будем сравнивать результаты нашей программы.
Решим интеграл тремя разными способами, но при одном n, допустим n = 12.
Точное значение = 2.350402.
Решим методом Симпсона:
программирование matlab паскаль язык
Решим методом трапеций:
Решим методом Ньютона:
Судя по результатам, можно сделать вывод о том, что программа работает правильно.
3. Решение задания на языке высокого уровня Паскаль
Листинг программы
Модульmain:
programKursVar4;
uses menu;
begin
menu_1;
end.
Модульmenu:
unit menu;
Interface
procedure menu_1;
Implementation
uses crt, math, output;
procedure menu_1;
var c, n : integer;
f : real;
begin
clrscr;
writeln(' 1');
writeln(' I = S(e^x)dx');
writeln(' -1');
writeln('1. Solve by Simpson');
writeln('2. Solve by trapeze');
writeln('3. Solve by Newton');
write('>> ');
read(c);
case c of
1: begin
clrscr;
f := Simpson(n);
end;
2: begin
clrscr;
f := Trap(n);
end;
3: begin
clrscr;
f := Newton(n);
end;
4: begin
clrscr;
halt;
end;
else
begin
menu_1;
end;
end;
output_I(f, c, n);
writeln('Push any button to proceede to main menu...');
readln;
menu_1;
end;
end.
Модульmath:
unit math;
Interface
function Simpson(var n: integer): real;
function Trap(var n: integer): real;
function Newton(var n: integer): real;
function y(x: real): real;
Implementation
uses crt, input;
var a, b : integer;
function Simpson(var n: integer): real;
var h, sum : real;
i, p: integer;
begin
n := get_n;
a := -1; b := 1;
h := (b - a) / n;
sum := 0;
for i := 1 to n - 1 do
begin
if i mod 2 = 0 then
p := 2
else
p := 4;
sum := sum + p * y(a + h * i);
end;
sum := sum + y(a) + y(b);
sum := sum * (h / 3);
Simpson := sum;
end;
function Trap(var n: integer): real;
var h, sum : real;
i : integer;
begin
n := get_n;
a := -1; b := 1;
h := (b - a) / n;
sum := 0;
for i := 0 to n - 1 do
sum := sum + y(a + i * h) + y(a + (i + 1) * h);
sum := sum * (h / 2);
Trap := sum;
end;
function Newton(var n: integer): real;
var h, sum1, sum2, sum: real;
i : integer;
begin
n := get_n;
a := -1; b := 1;
h := (a - b) / n;
sum1 := 0; sum2 := 0;
for i := 0 to n - 1 do
if i mod 3 = 0 then
sum1 := sum1 + y(a + i * h)
else
sum2 := sum2 + y(a + i * h);
sum := 3 / 8 * h * (y(a) + y(b) + 2 * sum1 + 3 * sum2);
Newton := sum;
end;
function y(x : real): real;
begin
y := exp(x);
end;
end.
Модульinput:
unit input;
Interface
function get_n : integer;
function file_n : integer;
function console_n : integer;
Implementation
uses crt;
function get_n : integer;
var c : integer;
begin
clrscr;
writeln('Input N:');
writeln('1. From file');
writeln('2. From console');
write('>> ');
readln(c);
if c = 1 then
get_n := file_n
else
get_n := console_n;
end;
function file_n : integer;
var t : text;
n : integer;
begin
clrscr;
assign(t, 'input_n.txt');
reset(t);
read(t, n);
close(t);
clrscr;
file_n := n;
end;
function console_n : integer;
var n : integer;
begin
clrscr;
write('Input N: ');
readln(n);
delay(300);
clrscr;
console_n := n;
end;
end.
Модульoutput:
unit output;
Interface
procedure output_I(f : real; i, n : integer);
procedure file_I(f : real; i, n : integer);
procedure console_I(f : real; i, n : integer);
Implementation
uses crt;
procedure output_I(f : real; i, n : integer);
var c : integer;
begin
writeln('Output I:');
writeln('1. File');
writeln('2. Console');
writeln('3. File&Console');
write('>> ');
readln(c);
if c = 1 then
file_I(f, i, n)
else
if c = 2 then
console_I(f, i, n)
else
begin
file_I(f, i, n);
console_I(f, i, n);
end;
end;
procedure file_I(f : real; i, n : integer);
var t : text;
r : real;
begin
assign(t, 'output_f.txt');
rewrite(t);
if i = 1 then
writeln(t, 'Solved by Simpson method: n = ', n)
else
if i = 2 then
writeln(t, 'Solved by trapeze method: n = ', n)
else
writeln(t, 'Solved by Newton method n = ', n);
writeln(t, ' 1');
writeln(t, ' I = S(e^x)dx = ', f);
writeln(t, ' -1');
r := exp(1) - exp(-1);
writeln(t, 'Exact value: ', r);
r := f - r;
writeln(t, 'Difference: ', r);
close(t);
end;
procedure console_I(f : real; i, n : integer);
var r : real;
begin
clrscr;
if i = 1 then
writeln('Solved by Simpson method: n = ', n)
else
if i = 2 then
writeln('Solved by trapeze method: n = ', n)
else
writeln('Solved by Newton method n = ', n);
writeln(' 1');
writeln(' I = S(e^x)dx = ', f);
writeln(' -1');
r := exp(1) - exp(-1);
writeln('Exact value: ', r);
writeln('Difference: ', f - r);
end;
end.
Тестирование
Решим методом трапеций:
Решим методом Ньютона:
Решим методом Симпсона:
Судя по результатам, можно сделать вывод о том, что программа работает правильно.
4. Построение графического решения задачи в пакете Matlab
График MATLAB
MATLAB:
X= linspace(-2, 2);
Y = exp(X);
X1 = linspace(-1, 1);
Y1 = exp(X1);
%plot(X1, Y1);
plot(X, Y);
hold on;
area(X1, Y1, `FaceColor', `y');
grid on;
axis on;
title(` y = e^x');
xlabel(`X');
ylabel(`Y');
text(0, 0.5, `S');
Заключение
Краткие сведения о проделанной работе:
Была осуществлена задача вычислительной математики на двух языках: #Си и Pascal.
Данная задача может послужить ярким примером использования структурного программирования, так как включает в себя его основы:
использования следующих структур: следования, ветвлений и циклов; использование модульного программирования и использование нисходящего программирования.
Плюсы и минусы итоговой программы:
Плюсы:
1). Программа включает в себя такие структуры как: условные операторы, операторы множественного выбора, функции, процедуры, модули, файлы.
2). Занимает небольшой объем оперативной памяти.
3). Совмещена практически с любой операционной системой.
4). Может запускаться как с использованием среды, так и с помощью файла exe.
5). Цикл, который реализует повтор программы после вычисления, так как пользователь может захотеть сверить результаты расчетов с помощью разных методов вычисления интегралов.
Минусы:
1). Данная программа не имеет проверки ввода количества разбиений отрезка, как с клавиатуры, так и из файла.
2). Пользователь не имеет возможности выйти из программы до ее завершения.
В дальнейшем минусы могут быть исправлены, улучшив программу и сделав ее более функциональной и адаптированной.
Выводы о проделанной работе можно разделить на две группы - выводы о различии Си и Паскаля, и выводы об эффективности структурного программирования.
Различия Си и Паскаля. Эти языки крайне похожи, но имеют серьезные различия в синтаксисе. Так, например, в обоих языках есть подпрограммы ввода и вывода, но в Си это printf и scanf, а в Паскале write и read. Так со многими командами, но они имеют одинаковый смысл, что делает несложным перевод кода с одного языка на другой
Эффективность структурного программирования. Структурное программирование заметно упрощает процесс написания программы. Благодаря использованию подпрограмм упрощается исправление ошибок, допущенных в ходе написания программы. А нисходящее программирование снижает количество ошибок
Дальнейшее применение этой программы вполне возможно. Модули вычисления интегралов можно использовать в других, более сложных программах, что является серьезным преимуществом структурного программирования
Список литературы
1. Рапаков Г., Ржеуцкая С. TurboPascal для студентов и школьников/ БХВ-Петербург 2002
2. Березин, Б.И. Начальный курс С и С++ / Б.И. Березин, С.Б. Березин - М.: Диалог-МИФИ, 2005. - 248 с.