Учебная работа. Курсовая работа: Разработка алгоритма программы нахождения производной методом неопределённых коэффициентов
Кафедра №10
«Математического, программного и
информационного обеспечения АСУ»
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по дисциплине
«1001 – Дискретная математика»
Тема: «Разработка метода программки нахождения производной
м
етодом неопределённых коэффициентов»
Управляющий:
Исполнитель:
СОДЕРЖАНИЕ
Введение
1.Постановка и уяснение задачки:
1.1анализ предметной области
1.1.1 Способ неопределённых коэффициентов
1.1.2 Внедрение интерполяционных многочленов
1.1.3 Внедрение естественно разностных соотношений для аппроксимации производных
2. Разработка метода и программки:
2.1 Разработка метода
2.2 Обоснование выбора языка программирования
2.3 Разработка программки
3.Экспериментальное исследование метода и программки:
3.1Решение задачки способом неопределённых коэффициентов
3.2 Тестирование программки
3.3. Управление программеру
Заключение
Перечень литературы
приложение А
Приложение Б
В
ведение
Задачка решения обычных дифференциальных уравнений труднее задачки вычисления однократных интегралов, и толика задач, интегрируемых в очевидном виде, тут значительно меньше.
Когда молвят о интегрируемости в очевидном виде, имеют в виду, что решение быть может вычислено с помощью конечного числа “простых” операций: сложения, умножения, вычитания, деления, возведения в степень, логарифмирования, потенцирования, вычисление синуса и косинуса и т.д.
Уже в период, предшествовавший возникновению ЭВМ , понятия “простой” операции перетерпели конфигурации. Решение неких личных задач так нередко встречаются в приложениях, что пришлось составить таблицы их значений, а именно таблицы интегралов Френеля, функций Бесселя и ряда остальных так именуемых особых функций. При наличии таковых таблиц исчезает принципная разница меж вычислением функций sinx, lnx,… и особых функций. В том и другом вариантах можно вычислять значения этих функций с помощью таблицы, и те и остальные функции можно приближая их многочленами, оптимальными дробями и т.д.
Таковым образом, в класс задач, интегрируемых в очевидном виде, врубились задачки, решение которых выражаются через особые функции. Но и этот, наиболее широкий, класс составляет относительно малую толику задач, предъявляемых к решению. Существенное расширение класса реально решаемых дифференциальных уравнений, а как следует и расширение сферы внедрения арифметики вышло с разработкой численных способов и активным повсеместным внедрением ЭВМ .
В истинное время издержки людского труда при решении на ЭВМ задачки Коши для обычных дифференциальных уравнений сравнимы с затратами на то, чтоб просто переписать поновой формулировку данной для нас задачки.
При желании можно получить график решения либо его изображение на дисплее. В итоге этого для почти всех категорий научных работников значительно уменьшился Энтузиазм к исследованию личных методов интегрирования обычных дифференциальных уравнений в очевидном виде.
Эта работа посвящена описанию 1-го из способов решения задачки Коши для обычных дифференциальных уравнений и исследования параметров этого способа.
Обратим внимание на то событие, что как и в остальных вариантах, начальный анализ практической пригодности способа делается, изучая простые задачки, где четкое и приближенное решение задачки выписываются в очевидном виде.
1.Постановка и уяснение задачки
нужно создать метод и программку, выполняющую задачку по нахождению производной способом неопределённых коэффициентов. нужно провести анализ имеющихся способов решения поставленной задачки. Более пригодным считать способ неопределённых коэффициентов. Результатом выполнения работы иметь корректно работающую программку и верно оформленную техно документацию.
1.1 анализ предметной области
1.1.1 Способ неопределённых коэффициентов
способ неопределённых коэффициентов применяется для численного дифференцирования таблично данной функции с произвольным расположением узлов. Он заключается в последующем.
Разыскиваемое выражение для производной
-го порядка для некой точке
xi
представляется в виде линейной композиции данных значений функции в узлах
0
1
xn
:
yi
(k)
=C0
y0
+C1
y1
+…+Cn
yn
.
(2.1)
Предполагается, что эта формула имеет пространство для многочленов:
y=1; y=x-xi
;…; y=(x-xi
)n
.
Подставляя поочередно эти многочлены в выражение (2.1) можно получить систему линейных алгебраических уравнений для определения коэффициентов С0
, С1
, …, С
n
.
Разглядим порядок использования данного способа для нахождения производной на последующем примере.
Отыскать выражение для определения производной у1
‘
в случае задания функции в четырёх равноотстоящих узлах.
Равенство (2.1) запишется в последующем виде
yi
(
k
)
0
0
1
1
+С2
у2
+
3
у3
.
(2.2)
Для нахождения производной у1
‘
используем, к примеру, последующие многочлены:
0
; у=(х-х0
)2
;
0
)3
. .
(2.3)
Производные этих многочленов будут иметь последующий вид соответственно:
‘=1; у’=2(х-х0
);
0
)2
. .
(2.4)
Подставляя поочередно соотношения (2.3) и (2.4) соответственно в правую и левую части равенства (2.2), получим в общем виде при х=х1
,
последующую систему линейных алгебраических уравнений для определения коэффициентов С0
, С1
, …, С
n
:
Опосля упрощения данная система линейных алгебраических уравнений воспримет последующий вид:
Решив данную систему уравнений, получим последующие значения коэффициентов и выражение для нахождения производной у1
‘
:
1.1.2 Внедрение интерполяционных многочленов
Пусть функция
задана в виде таблицы yi
(xi
)
,
с неизменным шагом
. Представим, что эта функция быть может аппроксимирована интерполяционным многочленом Ньютона:
Этот многочлен можно продифференцировать по
с учётом правила дифференцирования сложной функции:
В итоге можно получить формулы для вычисления производных хоть какого порядка. к примеру:
Пусть та же функция быть может аппроксимирована интерполяционным многочленом Лагранжа. Разглядим интерполяционный многочлен Лагранжа для варианта трёх узлов интерполяции (n=2):
Этот многочлен можно продифференцировать по
, тогда 1-ая производная будет иметь последующий вид:
А именно,
1.1.3 Внедрение естественно разностных соотношений для аппроксимации производных
Производной функции
в точке
0
именуется предел при
дела приращения функции в данной для нас точке к приращению аргумента (при условии, что этот предел существует). Для обозначения производной функции
в точке x0
употребляют знаки
0
либо
0
. Другими словами, по определению,
(1.1)
Аппроксимацией (приближением) производной при помощи дела конечных разностей именуется соотношение (1.2) в каком значения
,
конечные, в отличие от их нескончаемо малых значений в (1.1).
(1.2)
Пусть функция задана таблично с неизменным шагом
.
x0
x1
x2
…
xn
y0
y1
y2
…
yn
Зависимо от метода вычисления конечных разностей можно получить различные формулы для вычисления производных в одной и той же точке. К примеру, для нахождения производной
1
можно употреблять формулы левых, правых и центральных разностей, которые имеют последующий вид соответственно:
y1
=y1
y0
,
x=h, y1
‘=(y1
y0
)/h;
y1
=y2
y1
,
x=h, y1
‘=(y2
y1
)/h;
y1
=y2
y0
,
x=2h, y1
‘=(y2
y0
)/2h.
Аналогично можно отыскать выражения для определения старших производных. К примеру:
1
1
2
1
2
1
1
0
2
1
0
2
Оценим погрешность численного дифференцирования при помощи рассмотренных конечно-разностных соотношений. Для этого аппроксимируем функцию
некой функцией
, т.е. представим её в виде
(1.3)
В качестве
можно принять частичную сумму ряда либо интерполяционную формулу. Тогда погрешность аппроксимации
определяется остаточным членом ряда либо интерполяционной формулы. Аппроксимирующая функция
быть может применена для приближённого вычисления производной. Дифференцируя равенство (1.3) нужное количество раз, можно отыскать значение производной
(
l
)
(
l
)
(
l
)
. Величина
(
l
)
(
l
)
(
l
)
именуется погрешностью аппроксимации производной.
При численном дифференцировании функции, данной в виде таблицы с шагом
, эта погрешность зависит от
и её записывают в виде
hk
Показатель степени
именуют порядком погрешности аппроксимации производной. При всем этом предполагается, что
.
Оценку погрешности просто проиллюстрировать при помощи ряда Тейлора:
Пусть функция
задана в виде таблицы
xi
yi
,
. Запишем разложение данной для нас функции в ряд Тейлора при
1
с точностью до членов ряда порядка
:
0
1
1
2
Отсюда можно отыскать x
1
:
y1
‘ = (y1
y0
)/h + O(h2
)/h = (y1
y0
)/h + O(h).
Эта формула совпадает с формулой нахождения производной при помощи левых разностей и имеет 1-ый порядок точности.
Аналогично, при
1
выходит выражение для нахождения производной при помощи правых разностей, которая также имеет 1-ый порядок точности:
1
2
1
Используем сейчас ряд Тейлора для оценки погрешности аппроксимации производной при помощи центральных разностей. Полагая
и
при
1
, можно получить:
Вычитая 1-ое равенство из второго, получаем
Откуда можно получить выражение для нахождения производной при помощи правых разностей, которая имеет 2-ой порядок точности:
1
2
0
2
Складывая оба равенства, можно оценить погрешность аппроксимации производной второго порядка:
y1
» = (y2
‘
2y1
‘+y0
‘)/h2
+ O(h2
).
Эта аппроксимация имеет также 2-ой порядок точности.
Вывод
Существует много методов решения данной трудности, а конкретно нахождения производной. Они все имеют свои достоинства и недочеты. Говоря о плюсах рассматриваемого нами способа (неопределённых коэффициентов), можно сказать о:
1.Его точности
2.Ординарном методе внедрения
3.Его распространённости
2. Разработка метода и программки
2.1 Разработка метода
метод способа меньших квадратов включает последующие шаги:
1. Пояснение к программке и ввод данных.
2. Организуется цикл для расчёта коэффициентов при наличии в уравнении x-a5-ой степени.
3. Организуется цикл для расчёта коэффициентов при наличии в уравнении x-a4-ой степени.
4. Организуется цикл для расчёта коэффициентов при наличии в уравнении x-a3-ой степени.
5. Организуется цикл для расчёта коэффициентов при наличии в уравнении x-a2-ой степени.
6. Вывод приобретенного уравнения и неопределённых коэффициентов на экран.
2.2 Обоснование выбора языка программирования
прогресс компьютерных технологий обусловил процесс возникновения новейших различных знаковых систем для записи алгоритмов – языков программирования. Смысл возникновения такового языка – оснащённый набор вычислительных формул доборной инфы, превращает данный набор в метод. Язык программирования служит двум связанным меж собой целям: он даёт программеру аппарат для задания действий, которые должны быть выполнены, и сформировывает концепции, которыми пользуется программер, размышляя о том, что созодать.
Си ++ — это всепригодный язык программирования, загаданный так, чтоб создать программирование наиболее приятным для серьёзного программера. Кроме второстепенных деталей Си ++ является надмножеством языка программирования Си. Кроме способностей, которые дает Си, Си ++ предоставляет гибкие и действенные средства определения новейших типов. Используя определения новейших типов, буквально отвечающих концепциям приложения, программер может делить разрабатываемую программку на просто поддающиеся контролю части. Таковой способ построения программ нередко именуют абстракцией данных. информация о типах содержится в неких объектах типов, определённых юзером. Такие объекты ординарны и надёжны в использовании в тех ситуациях, когда их тип недозволено установить на стадии компиляции. Программирование с применением таковых объектов нередко именуют объектно-ориентированным. При правильном использовании этот способ даёт наиболее недлинные, проще понимаемые и легче управляемые программки.
Си ++ обеспечивает полный набор операторов структурного программирования. Он также дает особенно большенный набор операций. Почти все операции Си ++ соответствуют машинным командам, и потому допускают прямую трансляцию в машинный код. Обилие операций дозволяет выбирать их разные наборы для минимизации результирующего поля.
Си ++ поддерживает указатели не переменные и функции. Указатель на объект программки соответствует машинному адресу этого объекта. Средством разумного использования указателей можно создавать эффективно-выполняемые программки, потому что указатели разрешают ссылаться на объекты этим же самым путём, как это делает машинка. Си ++ поддерживает математику указателей, и тем дозволяет производить конкретный доступ и манипуляции с адресами памяти.
В своём составе Си ++ содержит препроцессор, который обрабатывает текстовые файлы перед компиляцией. Посреди его более нужных приложений при написании программ на Си ++ являются: определение программных констант, подмена вызова функций подобными, но наиболее резвыми макросами, условная компиляция. Препроцессор не ограничен процессированием лишь начальных текстовых файлов Си ++, он быть может применен для хоть какого текстового файла.
Си ++ — гибкий язык, позволяющий принимать в определенных ситуациях самые различные решения.
2.3 Разработка программки
Основываясь на разработанном методе и избранном языке, была написана программка.
тело программки состоит из главной функции, а сама функция из 5 операторов условия (if).
программка начинается с подключения обычной библиотеки “iostream”.
Дальше в программке с помощью встроенного в язык потока вывода “cout” мы выводим на экран условия выполнения задачки, а так же её условия и примечания, нужные для правильной и корректной работы программки.
cout<<«Programma dli naxoshdenui neopredelennux koefficientov»<<endl;
cout<<«Rukovodstvo:»<<endl;
cout<<«Vvedite koeffichenti pered X, nachinai s naimen’shey stepeni X-a»<<endl;
cout<<«Primechanie:»<<endl;
cout<<«Esli v uravnenie otsutstvuet X c kakoy libo stepen’u, ne bol’she 5-oy,»<<endl;
cout<<«to ego koefficent = 0″<<endl;
cout<<«Uslovia:»<<endl;
cout<<«Maximal’nai stepen’ X-a ne bol’she 5-oy»<<endl;
cout<<«Maximal’nai stepen’ y-ka ne bol’she 1-oy»<<endl;
cout<<«x0=0 , c0=1″<<endl;
Это поможет даже самому неопытному программеру разобраться в сути работы программки и научиться ей воспользоваться.
Дальше вводятся локальные переменные.
doublec1,c2,c3,c4,c5,c6;
double a,c,e,g,j;
cin>>a;
cin>>c;
cin>>e;
cin>>g;
cin>>j;
Их роль в программке состоит в том, чтоб составить условие, при котором программка обязана избрать верный путь решения того либо другого уравнения. Все эти переменные представляют собой коэффициенты перед переменными “х” разных степеней нашего начального уравнения. Зависимо от присутствия либо не присутствия переменной “x” той либо другой степени в уравнении, получаем определенную степень выходного уравнения.
Дальше используем оператор if (оператор условия) для определения в начальном уравнение переменной “х” пятой степени, т.к. это наибольшая степень “x”, под которую рассчитана программка.
if(j!=0){
c1=c0;c2=(c1+a)/2;c3=(c2+c)/3;c4=(c3+e)/4;c5=(c4+g)/5;c6=(c5+j)/6;
cout<<«Poluchennoe uravnenie:»<<«y2=»<<c1<<«+»<<c2<<«x»<<«+»<<c3<<«x*x»<<«+»<<c4<<«x*x*x»<<«+»<<c5<<«x*x*x*x»<<«+»<<c6<<«x*x*x*x*x»<<endl;}
Мы лицезреем, что при выполнении данного условия программка выводит на экран приобретенное уравнение, вкупе с подстановкой доныне неведомых неопределённых коэффициентов в него.
При невыполнение данного условия программка перебегает к последующему оператору if и производит те же самые деяния, что и с первым оператором. Так длится до того времени, пока в программке не выполнится выше обозначенное условие.
else if(g!=0){
c1=c0;c2=(c1+a)/2;c3=(c2+c)/3;c4=(c3+e)/4;c5=(c4+g)/5;c5=(c4+g)/5;
cout<<«Poluchennoe uravnenie:»<<«y2=»<<c1<<«+»<<c2<<«x»<<«+»<<c3<<«x*x»<<«+»<<c4<<«x*x*x»<<«+»<<c5<<«x*x*x*x»<<endl;}
else if(e!=0){
c1=c0;c2=(c1+a)/2;c3=(c2+c)/3;c4=(c3+e)/4;c5=(c4+g)/5;
cout<<«Poluchennoe uravnenie:»<<«y2=»<<c1<<«+»<<c2<<«x»<<«+»<<c3<<«x*x»<<«+»<<c4<<«x*x*x»<<endl;}
else if(c!=0){
c1=c0;c2=(c1+a)/2;c3=(c2+c)/3;c4=0;c5=0;c6=0;
cout<<«Poluchennoe uravnenie:»<<«y2=»<<c1<<«+»<<c2<<«x»<<«+»<<c3<<«x*x»<<endl;}
else if(a!=0){
c1=c0;c2=(c1+a)/2;c3=0;c4=0;c5=0;c6=0;
cout<<«Poluchennoe uravnenie:»<<«y2=»<<c1<<«+»<<c2<<«x»<<endl;}
При выполнении условия и выводе на экран уравнения, программка выводит на экран раздельно от приобретенного уравнения неопределённые коэффициенты.
cout<<«c1=»<<c1<<endl<<«c2=»<<c2<<endl<<«c3=»<<c3<<endl<<«c4=»<<c4<<endl<<«c5=»<<c5<<endl<<«c6=»<<c6<<endl;
В случае невыполнения ни 1-го из 5 критерий программка выдаст сообщение о ошибке:
else {cout<<«Uravnenie smisla ne imeet»<<endl;}
Выводы:
Произведённые в прошлых пт исследования дозволили составить метод поиска значений неопределённых коэффициентов;
1) Обусловлен выбор языка программирования;
2) На базе составленного метода составлена программка поиска значений неопределённых коэффициентов.
3) На базе составленного метода составлена программка поиска неопределённых коэффициентов.
3.Экспериментальное исследование метода и программки
3.1 Решение задачки способом неопределённых коэффициентов
Способ неопределённых коэффициентов заключается в том, что решение уравнения ищется в форме ряда с неведомыми коэффициентами:
0
0
)2
…,
которые находятся с помощью подстановки в уравнение, следующего приравнивания коэффициентов при схожих степенях и внедрения исходного условия, если оно задано.
Применим способ неопределённых коэффициентов к рассмотренной выше задачке. Потому что
0
= 0, то пишем
2
3
4
…
2
3
Подставляя
0
= 0, получаем в силу исходного условия, что a=1.Производим подстановку ряда в уравнение
2
x2
= a+bx+cx2
+dx3
-2 x2
-3x
Приравнивая коэффициенты при схожих степенях x, приходим к соотношениям:
a=b; c=(b-3)/2; d=(c-2)/3
И так мы получаем, что b=1, c= -1; d= -1.
3.2 Тестирование программки
Решим с помощью программызадачу, рассматриваемую в прошедшем разделе:
Для этого подставим коэффициенты перед переменной x, во всех степенях начиная с меньшей соответственно.
При решении 2-мя методами результаты совпали.
3.3 Управление программеру
Для того чтоб программка работала стремительно и отлично не требуется массивных компов и современных операционных систем. Ниже приведены малые характеристики компа, которые необходимы для работы:
· Центральный микропроцессор: IntelPentium 166 MHz(рекомендуется P2 400 MHz)
· Операционныесистемы: Microsoft Windows 98, Windows Millennium (Me), Windows 2000, Windows ХР
· Оперативная память: 128 Mb (рекомендуемая 256 Mb)
· Памяти на твердом диске: 115 Mb (при малогабаритной установке),
675 Mb (при полной установке), 580 Mb (при проф установке),
480 Mb (при индивидуальной установке)
· CD-ROM drive
монитор с разрешением VGA и выше.
Заключение
Данная работа посвящена разработке метода и программки решения задачки нахождения производной способом неопределённых коэффициентов. Сложность поставленной задачки обуславливается тем, что при нахождение производной данным способом, мы нередко получаем выходное уравнение с многочленами при огромных степенях. Решение такового уравнения быть может очень долгим, что востребует огромных издержек.
Рассмотренный способ неопределённых коэффициентов является одним из самых стремительных для поиска производной. Он лёгок для осознания и способен давать довольно четкие результаты.
Главные результаты работы сводятся к тому, что указывается принципиальная роль внедрения численных способов, а а именно способов нахождения производной, направление развития имеющихся способов, обуславливается выбор способа.
Направление последующих исследовательских работ целенаправлено развивать в разработке новейших наиболее четких и по способности обычных алгоритмов, которые бы заключали внутри себя все плюсы имеющихся способов, но исключали их недочеты. Новейшие способы должны быть очень информативны, учитывающими те причины, которые опускаются в уже имеющихся.
Перечень литературы
1.«Базы численных способов»-Л.И Турчак (1987г);
2. «Численные способы» Бохвалов Н.В.
приложение
A
#include <iostream.h>
double main(){
cout<<«Programma dli naxoshdenui neopredelennux koefficientov»<<endl;
cout<<«Rukovodstvo:»<<endl;
cout<<«Vvedite koeffichenti pered X, nachinai s naimen’shey stepeni X-a»<<endl;
cout<<«Primechanie:»<<endl;
cout<<«Esli v uravnenie otsutstvuet X c kakoy libo stepen’u, ne bol’she 5-oy,»<<endl;
cout<<«to ego koefficent = 0″<<endl;
cout<<«Uslovia:»<<endl;
cout<<«Maximal’nai stepen’ X-a ne bol’she 5-oy»<<endl;
cout<<«Maximal’nai stepen’ y-ka ne bol’she 1-oy»<<endl;
cout<<«x0=0 , c0=1″<<endl;
int c0=1;
double c1,c2,c3,c4,c5,c6;
double a,c,e,g,j;
cin>>a;
cin>>c;
cin>>e;
cin>>g;
cin>>j;
if(j!=0){
c1=c0;c2=(c1+a)/2;c3=(c2+c)/3;c4=(c3+e)/4;c5=(c4+g)/5;c6=(c5+j)/6;
cout<<«Poluchinoe uravnenie:
y2=»<<c1<<«+»<<c2<<«x»<<«+»<<c3<<«x*x»<<«+»<<c4<<«x*x*x»<<«+»<<c5<<«x*x*x*x»<<«+»<<c6<<«x*x*x*x*x»<<endl;}
else if(g!=0){
c1=c0;c2=(c1+a)/2;c3=(c2+c)/3;c4=(c3+e)/4;c5=(c4+g)/5;c5=(c4+g)/5;
cout<<«Poluchinoe uravnenie:
y2=»<<c1<<«+»<<c2<<«x»<<«+»<<c3<<«x*x»<<«+»<<c4<<«x*x*x»<<endl;}
else if(e!=0){
c1=c0;c2=(c1+a)/2;c3=(c2+c)/3;c4=(c3+e)/4;c5=(c4+g)/5;
cout<<«Poluchinoe uravnenie:
y2=»<<c1<<«+»<<c2<<«x»<<«+»<<c3<<«x*x»<<endl;}
else if(c!=0){
c1=c0;c2=(c1+a)/2;c3=(c2+c)/3;c4=0;c5=0;c6=0;}
else if(a!=0){
c1=c0;c2=(c1+a)/2;c3=0;c4=0;c5=0;c6=0;}
else {cout<<«Uravnenie smisla ne imeet»<<endl;}
cout<<«c1=»<<c1<<endl<<«c2=»<<c2<<endl<<«c3=»<<c3<<endl<<«c4=»<<c4<<endl<<«c5=»<<c5<<endl<<«c6=»<<c6<<endl;
return 0;}
приложение Б
]]>