Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Интегрирование Главы 7-8.doc
Скачиваний:
1
Добавлен:
12.11.2018
Размер:
2.29 Mб
Скачать
        1. Суммы в вычислении полиномов

Второй типовой вариант накопления сумм – вычисление полиномов. Технология предмашинной подготовки задачи свёртывания полиномов представлена конкретной задачей (8.2).

Постановка задачи

Рассчитать значение полинома

P(x) = 5 x6 + 0,8 x5 + 1,7 x4 – 3,2 x3 + 12 x2 – 0,1 x1 + 63

при x = 1,98, предусмотрев возможность использования значений всех промежуточных вычислений.

Формирование математической модели

Представим исходный полином в общем виде, изменив его обозначение на бесскобочное SP (сумма полинома):

SP = а0 x6 + а1 x5 + а2 x4 + а3 x3 + а4 x2 + а5 x + а6

и сформируем основные элементы математической формулировки.

Исходные данные

А(n) – массив коэффициентов (n = 7)

а0 = 5 а1 = 0,8 а2 = 1,7 а3 = -3,2 а4 = 12 а5 = 0,1 а6 = 63

x = 1,98

Расчётная зависимость

= а0 xn + а1 xn-1 + а2 xn-2 + ... + аi xn-i + ... + аn-1 x1 + аn

Выбор метода решения

Характерная особенность полиномов – обозначение индексов коэффициентов от 0 до n, а показателей степеней в обратном порядке от n до 0.

Решение аналогичных полиномов возможно напрямую. Однако более эффективно – проведение предварительных математических преобразований освобождения от показателей степеней по схеме Горнера.

= ((((а0 x + а1) x + а2) x + . . . + аi) x + . . . + аn-1) x + аn

Полученная запись предписывает вначале вычисление внутренней скобки (а0 x + а1) как суммы SP (начального слагаемого а0 x с текущим а1 при i = 1), а затем повторения вычислений SPi при следующих значениях i.

При этом запись полинома приобретает вид:

Обозначив начальную сумму SPi-1 (при i = 1) как SP0 = a0, получим SP1 = SP0 x + a1 = a0 x + a1. Повторив рассуждения для вычисления SP2, запишем SP2 = SP1 x + a1 = (a0 x + a1) x +a2. Аналогично могут быть получены все остальные текущие значения искомой суммы в рассматриваемой математической интерпретации.

Таким образом, последовательное накопление суммы в этом случае предполагает следующую методику вычислений:

  • формирование (до начала вычислений) значения суммы SP0=a0;

  • вычисление текущих значений суммы SPi последовательным суммированием произведения предыдущего значения суммы на аргумент (SPi-1 x), с текущим значением слагаемого ai;

Формирование текущих значений промежуточных вычислений SPi, в соответствии с требованиями задачи, выполним в виде одномерного массива.

Следовательно, методом решения является смешанный вычислительный процесс – циклический процесс арифметического типа с табличным заданием аргумента (одномерный массив А(n)) при изменении параметра цикла i по закону i = i + 1, дополненный стандартной методикой накопления суммы.

Составление алгоритма решения

Сформированная математическая модель и выбранный метод решения позволяют выполнить одношаговую схему алгоритма (рис. 8.6).

Рис. 8.6. Алгоритм решения задачи 8.2

Для улучшения наглядности организации вычислений элементы дружественности не показаны.

Программирование задачи

Идентификация переменных представлена в табл. 8.2.

Таблица 8.2

Обозначение в алгоритме

i

n

x

ai

SPi

Обозначение в программе

i

n

x

a[i]

sp[i]

С учётом таблицы идентификации на основании схемы алгоритма составлены программы решения задачи.

Классический вариант программирования задачи

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include <windows.h>

#define N 20 /* увеличенный размер массивов */

main( )

{

float x, a[N], sp[N];

int i, n;

char buf[50]; /*описание символьного массива*/

clrscr( );

CharToOem(" Введите численные значения n и x: ",buf);

printf("\n %s ",buf);

scanf("%d%f", &n, &x);

for( i=0 ; i<n ; i++ ) /* заголовок цикла ввода */

{

CharToOem(" Введите коэффициент а",buf);

printf("\n %s%i",buf,i);

scanf("%f", &a[i]);

}

printf("\n ---------------------------------"

"\n | i | ai | SPi |"

"\n ---------------------------------");

sp[0] = a[0];

for( i = 1 ; i<=n ; i++ ) /* заголовок цикла расчёта */

{

sp[i] = sp[i-1] * x + a[i];

printf("\n | %2d | %8.2f|%15.1f|", i, a[i], sp[i]);

}

printf("\n ---------------------------------");

CharToOem(" Значение полинома SP =",buf);

printf("\n %s %.2f",buf,sp[n]);

CharToOem(" при n=",buf);

printf(" %s %.d\n",buf,n);

getch();

}

7 1.98

5 0.8 1.7 -3.2 12 0.1 63

Под закрывающей скобкой программы располагаются численные значения исходных данных для решения задачи.

Результаты решения представлены в приложении 8.3.

Программирование задачи с графическим интерфейсом

Программирование задачи при использовании графического интерфейса предварим его разработкой.

ListBoxSP

Для ввода порядка и основания полинома планируем однострочные поля редактирования (EditN, EditX). Для ввода коэффициентов полинома – многострочное поле редактирования (EditAi). Вывод расчетных значений реализуем в поле-список (ListBoxSP).

Управление процессом решения реализуем двумя командными кнопками, расположенными в нижней части окна. Назначение каждой определяется ее названием.

С учетом планируемого интерфейса выполним программирование задачи.

#include<stdio.h>

#include<stdlib.h>

#define N 20 /* увеличенный размер массивов */

void TSumprDlgClient::Ok()

{

// INSERT>> Your code here.

float x, a[N], sp[N];

int i, n;

char buf[20]; /*описание символьного массива*/

ListBoxSP->ClearList();

EditN->GetText(buf, 10);

n = atoi(buf); /* ввод значения порядка*/

EditX->GetText(buf,10);

x=atof(buf); /* ввод значения основания полинома*/

for( i=0 ; i<n ; i++ ) /* заголовок цикла ввода */

{

EditAi->GetLine(buf, 20, i);

a[i]=atof(buf); /* ввод значения массы*/

}

sp[0] = a[0];

for( i = 1 ; i<=n ; i++ ) /*заголовок цикла расчёта */

{

sp[i] = sp[i-1] * x + a[i];

sprintf(buf,"%11.1f",sp[i-1]);

ListBoxSP->AddString(buf); /*вывод текущих значений sp*/

}

}

7 1.98

5 0.8 1.7 -3.2 12 0.1 63

Под закрывающей скобкой программы записаны численные значения исходных данных для решения задачи. Результаты решения представлены в приложении 8.4.