КУРСОВАЯ РАБОТА
на тему
Использование языков программирования высокого уровня для решения задач вычислительной математики
Содержание
Введение
Методы численного интегрирования, использующиеся в этой курсовой работе
Решение задания на языке высокого уровня C
Решение задания на языке высокого уровня Паскаль
Построение графического решения задачи в пакете Matlab
Заключение
Список используемой литературы
Постановка задачи: реализовать задачу вычислительной математики на двух языках программирования – Pascal и Си
Несмотря на простоту представленной математической задачи, она может служить прекрасным примером для обучения структурному программированию.
Структурное программирование основывается на 3-х основных составляющих:
1) Использование трех базовых структур – следования, ветвления и циклов
2) Модульное программирование (использования большого количества подпрограмм и модулей для разбития более сложной задачи на ряд простейших)
3) Нисходящее программирование – создание сначала основной функции, а потом последовательное присоединение к ней подпрограмм, стоящих по иерархии ниже по уровню.
В этой работе мы будем использовать все три составляющие – как разобьем программу на множество подпрограмм, так и будем использовать нисходящее программирование, для того чтобы улучшить согласованность подпрограмм между собой. Это позволит нам решить поставленную математическую задачу наиболее эффективно.
Постановка задачи
Найти значение интеграла , пользуясь методом трапеций, методом Симпсона и методом Ньютона для различных n (n=6, 12, 30). Сравнить с точным значением интеграла и оценить погрешности методов при указанных n. Изобразить график подынтегральной функции и заштриховать область, площадь которой равна значению интеграла.
Курсовая работа выполнена с учетом требований технологии структурного программирования. Программа предусматривает возможность ввода исходных данных с клавиатуры и чтение из файла, также программа осуществляет вывод результатов на экран и запись в файл. Диалоговое взаимодействие пользователя с программой реализуется через систему меню, что предоставляет пользователю последовательно выполнять различные действия.
Методы численного интегрирования, использующиеся в этой курсовой работе
Эти методы применяются для приближенного вычисления определенного интеграла вида: . Функция 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.d\n", b);
printf(" I = S(e^x)dx\n");
printf(" %1.d\n\n", a);
printf("1. Solve by Simpson\n2. Solve by trapeze\n3. Solve by Newton\n4. Exit\n>> ");
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 = %d\n", N);
else if (i == 2)
printf("Solved by trapeze method: n = %d\n", N);
else
printf("Solved by Newton method: n = %d\n", N);
printf("\n %3.d\n", b);
printf(" I = S(e^x)dx = %f\n", f);
printf(" %1.d\n\n", a);
printf("Exact value: %f\n", I);
printf("Difference: %f\n", 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 = %d\n", N);
else if (i == 2)
fprintf(t, "Solved by trapeze method: n = %d\n", N);
else
fprintf(t, "Solved by Newton method: n = %d\n", N);
fprintf(t, "\n %3.d\n", b);
fprintf(t, " I = S(e^x)dx = %f\n", f);
fprintf(t, " %1.d\n\n", a);
fprintf(t, "Exact value: %f\n", I);
fprintf(t, "Difference: %f\n", I - f);
fclose(t);
}
void output(float f, inti)
{
int c;
printf("Output I:\n1. File\n2. Console\n3. File&Console\n>> ");
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 file\n2. From console\n>> ");
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<