Рефераты - Афоризмы - Словари
Русские, белорусские и английские сочинения
Русские и белорусские изложения

Использование языков программирования высокого уровня для решения задач вычислительной математики

Работа из раздела: «Программирование, компьютеры и кибернетика»

Министерство образования и науки Российской Федерации

федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«Балтийский государственный технический университет «ВОЕНМЕХ» им. Д.Ф. Устинова»

(БГТУ «ВОЕНМЕХ» им. Д.Ф. Устинова»)

Стандарт организации

БГТУ.СМК-П-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 с.

ref.by 2006—2025
contextus@mail.ru