Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2010, 10:12   #1
lezvion
 
Регистрация: 07.11.2010
Сообщений: 7
По умолчанию Pascal. Решение функции методом Горнера

Здравствуйте. Дали мне вот такую функцию.

2*Exp(ln(x)*3)+1.7*Exp(ln(x)*6)+0.1 *Exp(ln(x)*9)+3.2*Exp(ln(x)*12)+0.4 *Exp(ln(x)*15)

Задание звучит:
Вычислить значения полинома
Y = 2*X3 + 1,7*X6 + 0,1*X9 + 3,2*X12 + 0,4*X15
для значений X, изменяющихся от 0 до 1 с шагом 0,05.

Вычислил используя Экспоненту, тьютор сказала решить методом Горнера. Прошу помочь оформить решение функции в Паскале, т.к не представляю как этот метод использовать. Заранее спасибо.
lezvion вне форума Ответить с цитированием
Старый 11.11.2010, 10:43   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Небольшое лирическое отступление о схеме Горнера.
Схе́ма Го́рнера (или правило Горнера, метод Горнера) — алгоритм вычисления значения многочлена, записанного в виде суммы мономов, при заданном значении переменной. Метод Горнера позволяет найти корни многочлена, а также вычислить производные полинома в заданной точке. Схема Горнера также является простым алгоритмом для деления многочлена на бином вида x − c. Метод назван в честь Уильяма Джорджа Горнера (англ.).
Пример реализации на С++:
Код:
/*
 * 6
 * 3
 * 1 3 -2 1 -1 1
 *
 * Ответ: 439
 */
 
#include <stdlib.h>		/** EXIT_FAILURE **/
#include <iostream>
using namespace std;
 
int main( int argc, char *argv[] )
{
	register unsigned int i;
	unsigned int n;
	cout << "Введите количество элементов: ";
	cin >> n;
 
	if ( n < 1 )
	{
		cerr << "Требуется хотя бы два элемента." << endl;
		return EXIT_FAILURE;
	}
 
	double *a = new double [n];
	double *b = new double [n];
 
	cout << "Введите эпсилон: ";
	double eps; cin >> eps;
 
	cout << "Введите " << n << " исходн. элем.:" << endl;
	for ( i = 0; i < n; i++ ) cin >> a[i];
 
	cout << endl;
 
	/* Рисуем верхнюю рамку */
	for ( i = 0; i < n; i++ ) cout << "+-------"; cout << "+" << endl;
 
	/* Выводим исходные элементы */
	for ( i = 0; i < n; i++ ) cout << "| " << a[i] << "\t"; cout << "|" << endl;
 
	/* Снова рамка */
	for ( i = 0; i < n; i++ ) cout << "+-------"; cout << "+" << endl;
 
	/* По условию, первый элемент b равен первому элементу a */
	b[0] = a[0];
	cout << "| " << *b << "\t";
	for( i = 1; i < n; i++ )
	{
		b[i] = b[i - 1] * eps;
		/* В этом месте b[i] будет равно значению, записываемому во вторую строчку */
		b[i] += a[i];
		cout << "| " << b[i] << "\t";
	}
	cout << "+" << endl;
 
	/* И ещё одна завершающая рамка */
	for ( i = 0; i < n; i++ ) cout << "+-------"; cout << "+" << endl << endl;
	cout << "Ответ: " << b[n-1] << endl;
 
	delete []b;
	delete []a;
	return 0;
}
Это я только Википедию открыл..
_-Re@l-_ вне форума Ответить с цитированием
Старый 11.11.2010, 10:59   #3
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Код:
const koefpolinom : array[0..15] of real =
 (0,0,0,2,0,0,1.7,0,0,0.1,0,0,3.2,0,0,0.4);
var
 step : real;
 x,bn,f : real;

function Gorner ( x : Real ): Real;
var i : integer;
begin
bn := 0;
for i:=15 downto 0 do
 begin
 bn := koefpolinom[i] + bn*x;
 end;
Result := bn;
end;

begin
step := 0;
while ( step <=1 ) do
 begin
 writeln ( step,'   ',Gorner(step));
 step := step + 0.05;
 end;
end.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 11.11.2010, 11:00   #4
lezvion
 
Регистрация: 07.11.2010
Сообщений: 7
По умолчанию

Я там был. Думаю для С++ алгоритм хороший, но мне бы на Паскале)
lezvion вне форума Ответить с цитированием
Старый 11.11.2010, 17:01   #5
lezvion
 
Регистрация: 07.11.2010
Сообщений: 7
По умолчанию

Большое спасибо! А не могли бы Вы откомментировать алгоритм? А то я половины не понял). Точнее:
Цитата:
const koefpolinom : array[0..15] of real =
(0,0,0,2,0,0,1.7,0,0,0.1,0,0,3.2,0, 0,0.4);
- для чего здесь массив, и что за цифры после real.

Цитата:
function Gorner ( x : Real ): Real;
- что это?)

Цитата:
for i:=15 downto 0 do
begin
bn := koefpolinom[i] + bn*x;
- для чего нужен этот цикл?


Спасибо!

Последний раз редактировалось lezvion; 11.11.2010 в 20:51. Причина: Некорректный вопрос
lezvion вне форума Ответить с цитированием
Старый 12.11.2010, 08:19   #6
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
Сообщение

Алгоритм я взял из Википедии.

Цитата:
const koefpolinom : array[0..15] of real =
(0,0,0,2,0,0,1.7,0,0,0.1,0,0,3.2,0, 0,0.4);
Это коэффициенты твоей функции. Первый элемент - свободный член. Последний элемент - коэффициент перед X^15. Там где в уравнении нет степенного члена - соответсвующий коэффициент равен 0.
X^0 - 0
X^1 - 0
X^2 - 0
X^3 - 2
X^4 - 0
X^5 - 0
X^6 - 1.7
итд

Цитата:
function Gorner ( x : Real ): Real;
Это функция в паскале, вычисляющая методом Горнера значение твоей математической функции от аргумента x.

Цитата:
for i:=15 downto 0 do
begin
bn := koefpolinom[i] + bn*x;
А это сам расчет функции методом Горнера.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Решение СЛАУ методом Гаусса-Жордана 2easy4me Помощь студентам 5 23.03.2011 18:56
Решение СЛАУ методом итерации (Pascal) mambr Помощь студентам 9 08.02.2011 21:29
решение уравнения методом хорд и методом Ньютона Маргоша)) Общие вопросы Delphi 1 21.04.2010 20:40
Решение уравнения методом деления отрезка пополам. Методом секущей. Panda196 Паскаль, Turbo Pascal, PascalABC.NET 3 25.11.2008 09:06
Решение нелинейных уравнений методом хорд, pascal Антонова Анна Помощь студентам 3 09.12.2007 19:24