Смекни!
smekni.com

Разработка алгоритма программы нахождения производной методом неопределённых коэффициентов (стр. 2 из 3)

Аналогично можно найти выражения для определения старших производных. Например:

y1''=( y1')'=(y2'-y1')/h=((y2-y1)/h-(y1-y0)/h)h=(y2-2y1+y0)/h2.

Оценим погрешность численного дифференцирования с помощью рассмотренных конечно-разностных соотношений. Для этого аппроксимируем функцию f(x) некоторой функцией j(x), т.е. представим её в виде

f(x)=j(x)+R(x). (1.3)

В качестве j(x) можно принять частичную сумму ряда или интерполяционную формулу. Тогда погрешность аппроксимации R(x) определяется остаточным членом ряда или интерполяционной формулы. Аппроксимирующая функция j(x) может быть использована для приближённого вычисления производной. Дифференцируя равенство (1.3) необходимое количество раз, можно найти значение производной f(l)(x)=j(l)(x)+R(l)(x). Величина R(l)(x)= f(l)(x)-j(l)(x) называется погрешностью аппроксимации производной.

При численном дифференцировании функции, заданной в виде таблицы с шагом h, эта погрешность зависит от h и её записывают в виде O(hk). Показатель степени k называют порядком погрешности аппроксимации производной. При этом предполагается, что |h|<1.

Оценку погрешности легко проиллюстрировать с помощью ряда Тейлора:

Пусть функция f(x) задана в виде таблицы f(xi)=yi, i=0,1,…n. Запишем разложение этой функции в ряд Тейлора при x=x1, Dx=-h с точностью до членов ряда порядка h:

y0 = y1-y1'h + O(h2).

Отсюда можно найти значение производной в точке x=x1:

y1' = (y1-y0)/h + O(h2)/h = (y1-y0)/h + O(h).

Эта формула совпадает с формулой нахождения производной с помощью левых разностей и имеет первый порядок точности.

Аналогично, при x=x1, Dx=h получается выражение для нахождения производной с помощью правых разностей, которая также имеет первый порядок точности:

y1' = (y2-y1)/h + O(h).

Используем теперь ряд Тейлора для оценки погрешности аппроксимации производной с помощью центральных разностей. Полагая Dx=-h и Dx=h при x=x1, можно получить:


Вычитая первое равенство из второго, получаем

Откуда можно получить выражение для нахождения производной с помощью правых разностей, которая имеет второй порядок точности:

y1' = (y2-y0)/2h + O(h2).

Складывая оба равенства, можно оценить погрешность аппроксимации производной второго порядка:

y1'' = (y2'-2y1'+y0')/h2 + O(h2).

Эта аппроксимация имеет также второй порядок точности.

Вывод

Существует много способов решения данной проблемы, а именно нахождения производной. Все они имеют свои преимущества и недостатки. Говоря о достоинствах рассматриваемого нами метода (неопределённых коэффициентов), можно сказать о:

1.Его точности

2.Простом способе применения

3.Его распространённости

2. Разработка алгоритма и программы

2.1 Разработка алгоритма

Алгоритм метода наименьших квадратов включает следующие шаги:

1. Пояснение к программе и ввод данных.

2. Организуется цикл для расчёта коэффициентов при наличии в уравнении x-a5-ой степени.

3. Организуется цикл для расчёта коэффициентов при наличии в уравнении x-a4-ой степени.

4. Организуется цикл для расчёта коэффициентов при наличии в уравнении x-a3-ой степени.

5. Организуется цикл для расчёта коэффициентов при наличии в уравнении x-a2-ой степени.

6. Вывод полученного уравнения и неопределённых коэффициентов на экран.

2.2 Обоснование выбора языка программирования

Прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов – языков программирования. Смысл появления такого языка – оснащённый набор вычислительных формул дополнительной информации, превращает данный набор в алгоритм. Язык программирования служит двум связанным между собой целям: он даёт программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать.

Си ++ - это универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьёзного программиста. За исключением второстепенных деталей Си ++ является надмножеством языка программирования Си. Помимо возможностей, которые дает Си, Си ++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определённых пользователем. Такие объекты просты и надёжны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод даёт более короткие, проще понимаемые и легче контролируемые программы.

Си ++ обеспечивает полный набор операторов структурного программирования. Он также предлагает необычно большой набор операций. Многие операции Си ++ соответствуют машинным командам, и поэтому допускают прямую трансляцию в машинный код. Разнообразие операций позволяет выбирать их различные наборы для минимизации результирующего поля.

Си ++ поддерживает указатели не переменные и функции. Указатель на объект программы соответствует машинному адресу этого объекта. Посредством разумного использования указателей можно создавать эффективно-выполняемые программы, так как указатели позволяют ссылаться на объекты тем же самым путём, как это делает машина. Си ++ поддерживает арифметику указателей, и тем самым позволяет осуществлять непосредственный доступ и манипуляции с адресами памяти.

В своём составе Си ++ содержит препроцессор, который обрабатывает текстовые файлы перед компиляцией. Среди его наиболее полезных приложений при написании программ на Си ++ являются: определение программных констант, замена вызова функций аналогичными, но более быстрыми макросами, условная компиляция. Препроцессор не ограничен процессированием только исходных текстовых файлов Си ++, он может быть использован для любого текстового файла.

Си ++ - гибкий язык, позволяющий принимать в конкретных ситуациях самые разные решения.

2.3 Разработка программы

Основываясь на разработанном алгоритме и выбранном языке, была написана программа.

Тело программы состоит из главной функции, а сама функция из пяти операторов условия (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;}