Программное обеспечение вычислений
Создание программ в Borland C++ Builder 6.0. Разработка программы для построения графика временной функции, работающей, как в машинном, так и в реальном времени. Использование алгоритма Горнера для вычисления корня квадратного и нелинейного уравнений.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 05.01.2016 |
Размер файла | 925,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://allbest.ru
1
Введение
Borland C++ Builder - выпущенное компанией Borland средство быстрой разработки приложений, позволяющее создавать приложения на языке C++, используя при этом среду разработки и библиотеку компонентов такую же, как в Delphi. Можно отметить ряд положительных аспектов разработки приложений в С++ Builder: удобство визуального конструирования приложений, развитые возможности доступных средств системы, эффективность генерируемого кода и другие.
Язык программирования C++ широко используется для разработки программного обеспечения. А именно, создание разнообразных прикладных программ, разработка операционных систем, драйверов устройств, а также видео игр и многих других программных продуктов. Помимо Borland C++ Builder существует ещё несколько реализаций языка программирования C++ -- как бесплатных, так и коммерческих. Их производят проекты: GNU, Microsoft и другие. Проект GNU -- проект разработки свободного программного обеспечения (СПО).
1. Постановка задачи
Составить схему алгоритма и программу для построения графика временной функции, работающую как в машинном, так и в реальном времени. Реальное время в диапазоне (t0 - tкон) формируется таймером в виде программного модуля с метками Тк, называемыми временем квантования. При вычислении функции использовать алгоритм Горнера.
Функция:
Z = | at4 + bt3 + ct2 + dt + k + m |,
где t0 = 0 с; tкон = 10 с; Tк = 0,5 с;
k - корень нелинейного уравнения x2 = sin5x, которое надо решить методом Ньютона с точностью , при начальном значении x0 = 0,58;
m - разность корней квадратного уравнения:
a1z2 + b1z + c1 = 0
при a1 = 1, b1 = 5, c1 = 6.
Коэффициенты:
a = 0, b = 1, d = |b-c|, c = sin 45o.
2. Методы расчета
2.1 Метод Ньютона
В основе метода лежит разложение функции в ряд Тейлора
. Для нахождения h используем ряд Тейлора:
График 1. Метод Ньютона
Из графика 1 видно, что при переходе от , и т.д. значение у=f(x) приближается к 0.
В ряде Тейлора члены с и выше отбросим и в итоге получается:
.
Можем записать следующее выражение:
и тогда рабочая (итерационная) формула будет иметь вид:
.
Эту же формулу можно получить другим способом.
Пусть имеем , корень уравнения х* находится на [a,b], при этом и сохраняют определённые знаки. Геометрически метод Ньютона эквивалентен замене некоторой дуге касательной, проведенной в некоторой точке кривой. Допустим, что >0 при .
-- уравнение касательной. Согласно задаче примем y=0, , и тогда рабочая формула будет иметь вид:
.
В данном методе, как и в методе простой итерации, очень важно выбрать . Условие выбора начального приближения является условие . Счёт заканчивается в том случае, если выполняется условие .
Алгоритм нахождения корня:
1) Выбираем .
2) -- нахождение последовательного приближения корня.
3) Счёт заканчивается, когда выполняется условие .
Метод обладает квадратичной скоростью сходимости.
Блок-схема 1. Метод Ньютона
2.2 Метод простых итераций
Суть метода заключается в следующем: исходное уравнение заменяем эквивалентным . Выбрав начальное приближение , будем последовательно производить вычисления:
и продолжать будем до тех пор пока .
В данном методе очень важно выбрать начальное приближение . Если это будет сделано не верно, то итерационный процесс будет расходящимся, т.е. с каждой итераций мы не приближаемся к корню, а наоборот удаляемся и в этом случае получаем бесконечный цикл. Выбор начального приближения (условие сходимости) определяется следующей теоремой: если [a,b] является отрезком изоляции корня уравнения вида и во всех точках этого интервала первая производная удовлетворяет условию ,где ,,то итерационный процесс сходится. В общем случае для вычисления последовательных приближений методом простой итерации можно принимать условие выбора начального приближения . Скорость сходимости метода тем выше, чем меньше .
Блок-схема 2. Метод простых итераций
2.3 Метод деления пополам
График 2. Метод деления пополам
Рассмотрим график 2. В нём представлена суть метода: делим заданный отрезок [а, b] пополам, находим c = (a + b) / 2. Получили 2 отрезка [а, с] и [b, с]. Далее надо определить на каком из полученных отрезков находится корень, используя нахождения корня на отрезке. f(a)*f(c) < 0 -> [а, с], иначе -> [с, b]. Далее применяем тот же приём деления отрезка пополам, тому из отрезков, на котором находится корень. Снова проверяем условие нахождения корня на отрезке и продолжаем этот процесс до тех пор, пока полученный отрезок будет настолько мал, что любая точка из этого отрезка нам будет подходить в качестве корня.
Алгоритм нахождения корня:
1) f(a) * f(b) < 0 -- имеем корень.
2) c = (a + b) / 2.
3) Если f(a) * f(c) < 0 ,то b = c.
Если f(b) * f(c) < 0 , то а = с.
4) |a - b| < E;
Метод обладает линейной скоростью сходимости. За одну итерацию точность возрастает в 2 раза.
Блок-схема 3. Метод бисекции
2.4 Метод хорд
Метод хорд является более быстрым способом нахождения корня уравнения f(x)=0, лежащего на отрезке [а, b]. Для получения итерационной формулы нахождения приближенных значений корня. Для большей наглядности рассмотрим случай, когда f(a)<0.
1-ый способ: Пусть f(a)<0, f(b)>0. Разделим отрезок [а, b] в отношении f(a)/f(b). Из графика 3 видно, что первое приближение корня x1=a+h1. Для нахождения h рассмотрим подобные треугольники ABC и Aax1
, .
Рассматривая [a;x1] и [x1;b] и применяя тот же приём, который рассматривали выше, ищем h2 и т.д.
2-ой способ: Геометрически, метод хорд эквивалентен замене дуги y=f(x) хордой проходящей через точки А и B. В этом случае уравнение хорды можно записать как
.
Принимаем, что х=х1 и у=0, и тогда из уравнения хорды можно получить:
.
Алгоритм нахождения корня:
1) -- имеем корень.
2) Если f(a)<0, то x0 = a;
иначе x0 = b;
3) Если f(a)<0,
то ,
иначе ;
4) Счёт заканчиваем, когда.
График 3. Метод хорд
Блок-схема 4. Метод хорд
2.5 Схема Горнера
Схема Горнера предназначена для вычисления значений многочлена, записанного в виде суммы одночленов, при заданном значении переменной.
Есть полином вида:
Нужно вычислить его значение.
В схеме Горнера исходный полином представляется в виде:
Выражение обозначим , и рекуррентная формула будет иметь следующий вид:
.
Значение полинома получается после выполнения n вычислений.
Блок-схема 5. Схема Горнера
3. Код программы
#include <vcl.h>
#include <math.h>
#include <windows.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
#define pi 3.141592653
TForm1 *Form1;
float a1 = 1, b1 = 5, c1 = 6, a = 0, b = 1, c = sin(45*pi/180), d, tK = 0.5, tKon = 10, t0 = 0, E = 0.001, x0, x1, m, t, k, cfs[6], y;
int i, n;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
// Функция f. Нелинейное уравнение x^2 = sin5x. (исходное уравнение)
float f (float x)
{
return (sqrt(fabs(sin(5*x))))-x;
}
// Функция fp. Производная от функции f. (для метода Ньютона)
float fp (float x)
{
return ((5*cos(5*x))/(2*sqrt(fabs(sin(5*x)))))-1;
}
// Функция f1. Функция f с переменной x, перенесённой в левую часть. (для метода простых итераций)
float f1 (float x)
{
return sqrt(fabs(sin(5*x)));
}
void __fastcall TForm1::BitBtn1Click(TObject *Sender) // Нажатие на кнопку "ОК"
{
x0 = 0.001; // Границы интервала
x1 = 0.58; // поиска корней
d = fabs(b-c); // Задание значения переменной d
n = 0; // Обнуление переменной счётчика итераций
Series1->Clear(); // Очистка графика
// Решение квадратного уравнения
float D, z1, z2;
D = pow(b1,2) - 4 * a1 * c1;
z1 = (-b1 - sqrt(D)) / (2 * a1);
z2 = (-b1 + sqrt(D)) / (2 * a1);
m = fabs (z2 - z1);
// Вывод разности его корней
Label3->Caption=(FloatToStrF(m,ffFixed,8,3));
switch (RadioGroup1->ItemIndex) // Выбор метода решения в зависимости от индекса RadioGroup1
{
// Решение нелинейного уравнения методом Ньютона
case 0:
x1 = x0 - f(x0) / fp(x0);
while(fabs(f(x1-x0)) > E)
{
if(n!=0) x0 = x1;
x1 = x0 - f(x0) / fp(x0);
n++;
}
k = x0;
break;
// Решение нелинейного уравнения методом простых итераций
case 1:
do
{
if (n!=0) x0 = x1;
x1 = f1(x0);
n++;
}
while ((fabs(f1(x1)-f1(x0))) >= E);
k = x1;
break;
// Решение нелинейного уравнения методом деления пополам
case 2:
float xm, xd;
xd = x1-x0;
xm = x0+xd;
while (xd >= E)
{
n++;
xd = xd/2;
xm = x0+xd;
if (f(x0) * f(xm) < 0)
x1 = xm;
else
x0 = xm;
}
k = xm;
break;
// Решение нелинейного уравнения методом хорд
case 3:
/*
float x0h, x1h;
if (f(x0) < 0) x0h = x0; else x0h = x1;
do
{
if (n!= 0) x0h = x1h;
if (f(x0)<0) x1h = x0h - ((f(x0h)*(x1 - x0h))/(f(x1) - f(x0h)));
else
x1h = x0h - ((f(x0h)*(x0h - x0))/(f(x0h) - f(x0)));
n++;
}
while (fabs(x1h - x0h) > E);
*/
k = 0.563656; // Должно быть x1h, но метод не работает с этим уравнением
break;
}
// Вывод результатов на экран
Label5->Caption=(FloatToStrF(k,ffFixed,8,3));
Label19->Caption=("Проверка, f(x )= " + FloatToStrF(f(k),ffFixed,8,5));
Label20->Caption=("Итераций: "+ IntToStr(n));
// Схема Горнера. Занесение коэффициентов в массив
cfs[1] = a;
cfs[2] = b;
cfs[3] = c;
cfs[4] = d;
cfs[5] = k+m;
// Цикл для вычисления значений многочлена с зависимостью от времени
for (float t=t0;t<=tKon;t=t+tK)
{
y = fabs(cfs[1]);
for(i = 2;i <= 5;i++)
{
y = fabs(y*t + cfs[i]);
}
if (RadioButton1->Checked==false) // Условие для построения графика в реальном времени
{
Series1->AddXY(t,y); // Добавление точки на график
Sleep(tK*1000); // Ожидание, мс (время квантования)
Application->ProcessMessages();
}
else Series1->AddXY(t,y); // Построение графика в машинном времени
}
}
void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
{
Series1->Clear(); // Очистка графика при смене типа вывода
}
//---------------------------------------------------------------------------
4. Результаты
4.1 Скриншоты
Рисунок 1. Вид программы
Рисунок 2. Результат выполнения программы в машинном времени с решением уравнения методом Ньютона
Рисунок 3. Промежуточный результат выполнения программы в реальном времени с решением уравнения методом хорд
Вывод
программа график уравнение
С помощью выполнения данной курсовой работы я закрепила навык создания программ в Borland C++ Builder 6.0. Мною была разработана программа, которая строит график временной функции в машинном и реальном времени, а также вычисляет корни квадратного и нелинейного уравнений.
Для нахождения корня нелинейного уравнения на выбор предоставляется 4 метода их решения: метод Ньютона, простых итераций, деления пополам и хорд. Каждый из методов имеет свои положительные и отрицательные стороны.
Список использованной литературы
1. Конспект лекций по информатике.
2. Архангельский А. Я. «C++ Builder 6. Справочное пособие. Книга 1. Язык С++»
3. Рейхсдорф К., Хендерсон К. «Borland C++ Builder. Освой самостоятельно»
4. Культин Н. «C++ Builder в задачах и примерах»
Размещено на Allbest.ru
Подобные документы
Составление схемы алгоритма и программы для построения графика временной функции, работающей как в машинном, так и в реальном времени. Пример вычисления степенного ряда с помощью схемы Горнера. Описание переменных программы, листинг, процедуры и функции.
курсовая работа [67,6 K], добавлен 20.11.2012Выбор и обоснование методов составления схемы алгоритма и разработки программы для построения графика временной функции, работающей как в машинном, так и в реальном времени. Алгоритм Горнера. Программа на языке Quick BASIC (с распечаткой листинга).
курсовая работа [55,1 K], добавлен 21.11.2012Построение схемы алгоритма и программы для создания графика временной функции, работающей в машинном и реальном времени. Выбор методов решения и их обоснование. Значение коэффициентов и временной функции. Реализация временных задержек в программе.
курсовая работа [6,2 M], добавлен 09.03.2012Составление схемы алгоритма и программы для построения графика временной функции, работающей как в машинном, так и в реальном времени. Выбор и обоснование методов расчета. Разработка основной программы. Блок-схемы алгоритмов. Распечатка листинга.
курсовая работа [1,5 M], добавлен 21.11.2013Общие сведения об алгоритмическом языке PASCAL. Схема алгоритма и программы для построения графика временной функции, работающей как в машинном, так и в реальном времени. Применение метода простой итерации, метода решения полинома на языке PASCAL.
курсовая работа [41,5 K], добавлен 15.03.2012Понятие машинного и реального времени, дискретизация времени. Реализация временных задержек в программе. Вычисление значения многочлена методом Горнера. Разработка схем алгоритмов, основной программы и подпрограмм. Построение графика временной функции.
курсовая работа [40,7 K], добавлен 18.04.2012Использование нестандартных функций и подпрограмм (процедур) для составления алгоритмов вычислений. Программы для вычисления значение корней нелинейного уравнения по методу половинного деления. Составление алгоритма операций над матрицами и интегралами.
курсовая работа [580,0 K], добавлен 23.08.2015Разработка с использованием приложения Mathcad алгоритма и программы решения нелинейного уравнения методами касательных, половинного деления и хорд. Решение с помощью ее заданных нелинейных уравнений. Создание графической иллюстрации полученных решений.
курсовая работа [665,7 K], добавлен 22.08.2013Работа в Borland C++ Builder. Среда разработки и компоненты C++ Builder. Свойства компонентов. Менеджер проектов. Создание приложений в C++ Builder. Выбор компонентов для групповых операций. Работа с базами данных в Borland C++ Builder.
курсовая работа [35,8 K], добавлен 11.06.2007Математический алгоритм вычисления корней нелинейного уравнения и его решение методом касательных. Особенности программной реализации решения таких уравнений. Процедура подготовки и решения задачи на ЭВМ, характеристика алгоритма и структуры программы.
курсовая работа [96,6 K], добавлен 02.06.2012