Вычисления значения и производной полинома по схеме Горнера
|
|
haav | Дата: Воскресенье, 23.10.2011, 15:39 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Вычисления значения и производной полинома по схеме Горнера
перенесено обсуждение отсюда
Quote Временно забудем о кодировке! Такой темы еще нет, но для программистов будет интересно. Ниже приведена программа вычислениz значения и производной полинома по схеме Горнера. Полином задан в стандартной форме по убыванию степеней аргумента: Y = A(0)*X^N+A(1)*X^(N-1)+...+A(N-1)*X+A(N) N - степень полинома; A - массив коэффициентов полинома; X - заданное значение аргумента; Y - значение полинома (в точке "Х"); P - значение производной (в точке "Х"). Второй день не могу превратить ее в подпрограмму с "вызывалкой" типа: Sub PGorn (N, A(), X, Y, P). Помогите пл-и-и-и-з-з-з!
Добавлено (23.10.2011, 13:26) --------------------------------------------- Dim As Integer N, J, K Dim As Single A(10), X, Y, P, Y1, P1 Dim As String F Data 1., 0., -6., 1., 4. N = 4 For J = 0 To N: Read A(J): Next J For X = 0 To 2.0 Step 0.25 P = 0 Y = A(0) For K = 1 To N P = P * X + Y Y = Y * X + A(K) Next K Y1=1.* X^4 - 6.* X^2 + X + 4. P1=4.* X^3 - 12.* X + 1. Print X, Y, P, Y1, P1 Next X Sleep End Таблица выводимых данных имеет вид (для прверки): X YG PG YA PA 0.00 4.00000 1.00000 4.00000 1.00000 0.25 3.87891 -1.93750 3.87891 -1.93750 0.50 3.06250 -4.50000 3.06250 -4.50000 0.75 1.69141 -6.31250 1.69141 -6.31250 1.00 0.00000 -7.00000 0.00000 -7.00000 1.25 -1.68359 -6.18750 -1.68359 -6.18750 1.50 -2.93750 -3.50000 -2.93750 -3.50000 1.75 -3.24609 1.43750 -3.24609 1.43750 2.00 -2.00000 9.00000 -2.00000 9.00000
Это нужно?
Code Sub PGorn(n As Integer,p As Single) Dim As Integer J, K Dim As Single Y1, P1,X,Y Dim As String F ReDim A(n) As Single Restore For J = 0 To N Read A(J) Next
For X = 0 To 2.0 Step 0.25 Y = A(0) For K = 1 To N P = P * X + Y Y = Y * X + A(K) Next K Y1=1.* X^4 - 6.* X^2 + X + 4. P1=4.* X^3 - 12.* X + 1. Print X, Y, P, Y1, P1 Next X Sleep End Sub PGorn(4,0) Data 1., 0., -6., 1., 4.
Большая просьба соблюдать правила форума. Вы можете сами создавать темы , а не писать все в одном месте. Это облегчит другим пользователям поиск.
Для создания новой темы нажмите на кнопку и озаглавьте в соответствием вашим обсуждением:
Мне приятно что вы интересуетесь Freebasic , но мне не нравится постоянно переносить посты.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ruddy | Дата: Понедельник, 24.10.2011, 09:30 | Сообщение # 2 |
Сержант
Группа: Заблокированные
Сообщений: 30
Статус: Offline
| Большое спасибо - буду пробовать! Вы правы - переносить посты не есть хорошо! Но боюсь в названии новой темы обнаружить свою инфобезграмотность! Спасибо.
|
|
| |
haav | Дата: Понедельник, 24.10.2011, 10:33 | Сообщение # 3 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Quote Но боюсь в названии новой темы обнаружить свою инфобезграмотность!
Тут нечего бояться Евгений , вы не на минном поле. Называйте тему так, как вы считаете правильным.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ruddy | Дата: Понедельник, 24.10.2011, 14:52 | Сообщение # 4 |
Сержант
Группа: Заблокированные
Сообщений: 30
Статус: Offline
| "Фетяска"! Постарался максимально следовать Вашим рекомендациям: Sub PGorn(N As Integer, X As Single, Y As Single, P As Single) Dim As Integer J, K ReDim A(N) As Single ' это я не слишком понимаю Restore ' это я не слишком понимаю P = 0 Y = A(0) For K = 1 To N P = P * X + Y Y = Y * X + A(K) Next K End Sub ' Dim As Integer N, J Dim As Single A(10) Dim As Single X, Y, P, Y1, P1 Dim As String F Data 1., 0., -6., 1., 4. For J = 0 To N : Read A(J) : Next J F = " #.## ###.##### ###.##### ###.##### ###.#####" Print " X YG PG YA PA" For X = 0 To 2.0 Step 0.25 PGorn(N, X, Y, P) ' вызов подпрограммы Y1=1.* X^4 - 6.* X^2 + X + 4. P1=4.* X^3 - 12.* X + 1. Print Using F; X, Y, P, Y1, P1 Next X Sleep End но ответ получился "неверным"! Передача параметров? X YG PG YA PA 0.00 0.00000 0.00000 4.00000 1.00000 0.25 0.00000 0.00000 3.87891 -1.93750 0.50 0.00000 0.00000 3.06250 -4.50000 0.75 0.00000 0.00000 1.69141 -6.31250 1.00 0.00000 0.00000 0.00000 -7.00000 1.25 0.00000 0.00000 -1.68359 -6.18750 1.50 0.00000 0.00000 -2.93750 -3.50000 1.75 0.00000 0.00000 -3.24609 1.43750 2.00 0.00000 0.00000 -2.00000 9.00000
|
|
| |
haav | Дата: Понедельник, 24.10.2011, 16:58 | Сообщение # 5 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Может так попробовать:
Code 'A() - массив со значениями 'Xend - конечный предел значения X 'Xstep - шаг или точность 'N - степень Sub PGorn(A() As Single, Xend As single,Xstep As Single, N As Integer) Dim As Single Y1,P,P1,X,Y For X = 0 To Xend Step Xstep P =0 Y = A(0) For K As Integer= 1 To N P = P * X + Y Y = Y * X + A(K) Next K Y1=1.* X^4 - 6.* X^2 + X + 4. P1=4.* X^3 - 12.* X + 1. Print X, Y, P, Y1, P1 Next Sleep End Sub
Dim a(10) As Single= {1,0,-6,1,4} PGorn(a(),2,0.25,4)
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ruddy | Дата: Понедельник, 24.10.2011, 17:17 | Сообщение # 6 |
Сержант
Группа: Заблокированные
Сообщений: 30
Статус: Offline
| Стас, этот вариант не подходит – подпрограмма должна получать от основной программы степень полинома N, массив значений коэффициентов полинома A(K), значение переменной (аргумента) X и выдавать вычисленные значения полинома Y и его производной P в точке X. Цикл по аргументу X нужен только для целей демонстрационных...
|
|
| |
haav | Дата: Понедельник, 24.10.2011, 18:20 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Правильность поставленной задачи очень влияет на результат. Я ведь не знаком с полиномами , а если и был когда то знаком может быть, то все уже хорошенько забыл....
Поэтому:
1) Мне нужна четкая математическая формула без всяких многоточей для вычисления ( например для трех значений):
- значения полинома Y
- и его производной P
2) Функция должна что-нибудь возвращать? Или просто печатать результаты в консоли?
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ruddy | Дата: Понедельник, 24.10.2011, 19:22 | Сообщение # 8 |
Сержант
Группа: Заблокированные
Сообщений: 30
Статус: Offline
| Полином это частный случай многочлена, имеющий вид (сумма степеней X): Y = A(0)*X^N+A(1)*X^(N-1)+...+A(N-1)*X+A(N) здесь: N - степень полинома (целое число большее нуля) A() - массив (вектор) значений коэффициентов Y – численное значение полинома в точке X P – значение производной полинома в точке X В примере рассматривается полином четвертой степени: Y=1.* X^4 - 6.* X^2 + X + 4. Выражение для его производной имеет вид: P=4.* X^3 - 12.* X + 1. Здесь (и далее) математические процедуры (подпрограммы и функции) ничего не вводят с клавиатуры (или другого устройства) и ничего не выводят на консоль (или другое устройство). Их задача - вычислять по определенному алгоритму (вот этим и хочу заняться) значения указанных переменных и передавать эти значения вызвавшей (основной) программе для вывода на консоль (или другое устройство) и дальнейшей обработке.Добавлено (24.10.2011, 19:22) --------------------------------------------- Так понимаю, что основная проблема заключается в механизме передачи параметров (переменных, в том числе массивов) между основной (вызывающей) программой и вызываемой из нее процедуры (подпрограммы или функции). При пересылке массивов желательно не указывать в тексте процедуры границы массивов (они задаются в основной программе).
|
|
| |
haav | Дата: Понедельник, 24.10.2011, 19:48 | Сообщение # 9 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Боюсь что если условия задачи не будут уточнены, я не смогу вам помочь.
Я просил формулу для трех значений без мнототочей, от вас я получил следующее:
Y = A(0)*X^N+A(1)*X^(N-1)+...+A(N-1)*X+A(N)
По этой формуле второе и последующие значения степеней равны N-1 . То есть если N=3, то все последующие будут иметь 2
Смотрю пример:
Y=1.* X^4 - 6.* X^2 + X + 4.
Здесь у второго значения степень меньше в два раза, потом почему-то прибавляется X и 4 . Если судя по формуле, то у второго значение степени должэно быть 3
Для производного P я формулы вообще не увидел.
Я не ясновидящий, и учить заного алгебру через более чем 20 лет с момента последнего урока мне тоже не хочется...
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ruddy | Дата: Вторник, 25.10.2011, 10:52 | Сообщение # 10 |
Сержант
Группа: Заблокированные
Сообщений: 30
Статус: Offline
| Стас, прошу Вас, не огорчайтесь и не обижайтесь! С алгеброй разберемся, на худой конец, придумаю другой пример. Но очень хочется постичь механизм передачи данных между модулями. Отвечу полнее чуть позже...Добавлено (25.10.2011, 10:52) --------------------------------------------- Стас, пока появилась минутка времени, спешу внести первые пояснения: 1) Если дана функция Y = F(x) = x^a (словами: x в степени a, где a – целое число), то ее первая производная будет P = F`(x) = a*x^(a-1). Думаю, это отступление нам совсем не нужно :-) В рассматриваемом примере полином 4-ой степени имеет вид: Y1=1*X^4 + 0*X^3 - 6*X^2 + 1*X + 4 и его первая производная: P1=1*4*X^(4-1) + 0*1*X^(3-1) – 6*2*X^(2-1) + 1*X^(1-1) или выполняя действия: P1=4*X^3 – 12*X + 1 2) Но самое главное, что результаты первой переданной программы (без выделения подпрограммы) меня (думаю и всех) вполне устраивают: X YG PG YA PA 0.00 4.00000 1.00000 4.00000 1.00000 0.25 3.87891 -1.93750 3.87891 -1.93750 0.50 3.06250 -4.50000 3.06250 -4.50000 0.75 1.69141 -6.31250 1.69141 -6.31250 1.00 0.00000 -7.00000 0.00000 -7.00000 1.25 -1.68359 -6.18750 -1.68359 -6.18750 1.50 -2.93750 -3.50000 -2.93750 -3.50000 1.75 -3.24609 1.43750 -3.24609 1.43750 2.00 -2.00000 9.00000 -2.00000 9.00000 Аналог программы, написанный на QBasic 4.5, работает (как и многие другие) совершенно правильно... 3) Стас, мы на верном пути, наше дело правое, победа будет за нами! Мы еще брошюру про FreeBASIC с примерами математических программ напишем :-) С нетерпением жду Ваших вопросов, предложений...
|
|
| |
haav | Дата: Вторник, 25.10.2011, 13:30 | Сообщение # 11 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Евгений!
Так какой смысл тогда ворочаться мне с формулами. Если у Вас есть работающий аналог с вызовом процедуры на Qbasic 4.5 , напишите его здесь, я попробую его адаптировать под FreeBasic. Тем более что с формулой производной я все равно ничего не понял. Понимаете, я человек очень логичный и люблю логику, чем-то схож по логике мышления с компьютером (как ему сложно что-то объяснить, так и мне ) Тем более что вы представляете вещи, либо обрывающиеся в начале , либо в конце. В итоге я выдаю результаты неверные
Где логика здесь? :
P1=1*4*X^(4-1) + 0*1*X^(3-1) – 6*2*X^(2-1) + 1*X^(1-1)
Как я смогу эту логику подставить процессору, когда число степеней изменится?
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ruddy | Дата: Вторник, 25.10.2011, 15:28 | Сообщение # 12 |
Сержант
Группа: Заблокированные
Сообщений: 30
Статус: Offline
| Стас, прошу Вас, не ищите логику в алгоритме! Нужно наладить передачу данных при вызове. Ниже исходный (работающий) текст для QBasic 4.5. SUB PGRN (N%, A(), X, Y, P) '------------------------------------------------------------- ' Модуль вычисления значения и производной по схеме Горнера '------------------------------------------------------------- ' Y = A(0)*X^N+A(1)*X^(N-1)+...+A(N-1)*X+A(N) ' N - степень полинома; ' A - массив коэффициентов полинома; ' X - значение аргумента; ' Y - значение полинома (в точке "Х"); ' P - значение производной (в точке "Х"). P = 0 ' Значение производной в точке Y = A(0) ' Значение полинома в точке FOR K% = 1 TO N% P = P * X + Y Y = Y * X + A(K%) NEXT K% END SUB ' ' P R O G R A M "TSPGRN" ' 11.09.87 '------------------------------------------------------------- ' Проверка вычисления значения и производной полинома '------------------------------------------------------------- DECLARE SUB PGRN (AR%, AR!(), AR!, AR!, AR!) ' Параметры полинома DATA 1., 0., -6., 1., 4. N% = 4 DIM A(N%) FOR J% = 0 TO N%: READ A(J%): NEXT J% PRINT " X YG PG YA PA" F$ = " #.## ###.##### ###.##### ###.##### ###.#####" FOR X = 0 TO 2.0 STEP 0.25 CALL PGRN (N%, A(), X, Y, P) ' Вычисления по аналитическим формулам Y1=1.* X^4 - 6.* X^2 + X + 4. P1=4.* X^3 - 12.* X + 1. PRINT USING F$; X, Y, P, Y1, P1 NEXT X ENDДобавлено (25.10.2011, 15:28) --------------------------------------------- Стас, давайте рассмотрим простую программу. Вот текст работающей программы: ' 25.10.2011 '------------------------------------------------------------- ' Простая подпрограмма поиска максимального элемента '------------------------------------------------------------- ' N - Количество значений в массиве; ' A() – Элементы исходного массива; ' M - Номер максимального элемента; ' MAX – значение максимального элемента; Data 3.3, 6.6, 4.4, 5.5, 7.7, 1.1, 2.2 Dim As Integer J, N, M Dim As Single MAX, A(10) N = 7 For J = 1 To N : Read A(J) : Next J MAX = A(1) : M =1 For J = 1 To N If A(J) > MAX Then MAX = A(J) : M = J Next J Print " MAX = ", M, MAX Sleep End ' программа выводит на экран: ' MAX = 5 7.7 Теперь, хочется преобразовать эту программу в подпрограмму имеющую "вызывалку": IMAX (N, A(), M, MAX) пока в тех же обозначениях, что и в программе. На следующем шаге необходимо написать подпрограмму так, что бы она могла работать с массивами, имеющими границы Imin (минимальный индекс) и Imax (максимальный индекс), которые могут быть как положительными, так и отрицательными, например A(-2, 5). Вот что для меня непреодолимая сегодня трудность!
|
|
| |
haav | Дата: Вторник, 25.10.2011, 17:24 | Сообщение # 13 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Quote Стас, прошу Вас, не ищите логику в алгоритме!
А где же ее тогда искать?
Вот ваш же код, работающий на FreeBasic, запишите его в редактор FbEdit и запускайте:
Code #Lang "QB" SUB PGRN (N%, A(), X, Y, P) '------------------------------------------------------------- ' Модуль вычисления значения и производной по схеме Горнера '------------------------------------------------------------- ' Y = A(0)*X^N+A(1)*X^(N-1)+...+A(N-1)*X+A(N) ' N - степень полинома; ' A - массив коэффициентов полинома; ' X - значение аргумента; ' Y - значение полинома (в точке "Х"); ' P - значение производной (в точке "Х"). P = 0 ' Значение производной в точке Y = A(0) ' Значение полинома в точке FOR K% = 1 TO N% P = P * X + Y Y = Y * X + A(K%) NEXT K% END SUB ' ' P R O G R A M "TSPGRN" ' 11.09.87 '------------------------------------------------------------- ' Проверка вычисления значения и производной полинома '------------------------------------------------------------- 'DECLARE SUB PGRN (AR%, AR!(), AR!, AR!, AR!) ' Параметры полинома DATA 1., 0., -6., 1., 4. N% = 4 DIM A(N%) FOR J% = 0 TO N%: READ A(J%): NEXT J% PRINT " X YG PG YA PA" F$ = " #.## ###.##### ###.##### ###.##### ###.#####" FOR X = 0 TO 2.0 STEP 0.25 CALL PGRN (N%, A(), X, Y, P) ' Вычисления по аналитическим формулам Y1=1.* X^4 - 6.* X^2 + X + 4. P1=4.* X^3 - 12.* X + 1. PRINT USING F$; X, Y, P, Y1, P1 NEXT X Sleep
Я в шоке от Qbasic !!!!!!!!! Как на нем вообще люди писали? В цикле параметр P с потолка берет значения каждый раз разные и отправляет в процедуру. В процедуре если убрать параметр P ( ведь он все равно обнуляется), то результат другой. Я когда-то писал программы на ZX Spectrum , но даже на том компьютере я такого не встречал...
В общем что я могу посоветовать: читайте срочно учебник по FreeBasic и забудьте все что вы знали про Qbasic Вы задаете тему обсуждения, которая после прочтения учебника отпадет сама собой. FreeBasic-это совсем другой уровень программирования и мышления. Не пытайтесь примерять одежду мухи на слона.
Обсуждать Qbasic алгоритмы и сравнивать их работу с Freebasic у меня желания больше нет. Если у Вас ностальгия по Qbasic , вы можете писать программы как раньше в редакторе FbEdit . Выше код показывает как это делать.
Надеюсь я вас не обидел.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ruddy | Дата: Вторник, 25.10.2011, 18:17 | Сообщение # 14 |
Сержант
Группа: Заблокированные
Сообщений: 30
Статус: Offline
| То, что в цикле параметр P берет с потолка значения (при желании это можно избежать) - совсем не страшно, если учесть, что этот параметр каждый раз при обращении вычисляется в самой процедуре (у подпрограммы – только ее вывод). А вот как написать подпрограмму на "чистом" FreeBASIC, т.е. не использовать "примочку" #Lang "QB" осталось загадкой. Вы неправильно меня поняли, я не собирался здесь обсуждать язык QBasic (как и не собирался писать на нем программы, у меня их есть!). Я пришел сюда научиться с Вашей помощью программировать на FreeBASIC! Согласитесь, что человеку, знающему "только русский" читать учебник по FreeBasic, даже если смогу найти, напряженно! Конечно, не обиделся, спасибо! Так мы продолжим диалог или разбегаемся?
|
|
| |
haav | Дата: Вторник, 25.10.2011, 18:40 | Сообщение # 15 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата Согласитесь, что человеку, знающему "только русский" читать учебник по FreeBasic, даже если смогу найти, напряженно!
Не понял... Учебник на русском же написан. Там обсуждаются практически все моменты языка.
Что касается вашего кода, то и об этом там сказано. Нужно просто почитать главу про Byval и Byref
Вот ваш код на чистом FreeBasic:
Код SUB PGRN (N As Integer, A() As Single,byref X As Single,byref Y As single,byref P As Single) '------------------------------------------------------------- ' Модуль вычисления значения и производной по схеме Горнера '------------------------------------------------------------- ' Y = A(0)*X^N+A(1)*X^(N-1)+...+A(N-1)*X+A(N) ' N - степень полинома; ' A - массив коэффициентов полинома; ' X - значение аргумента; ' Y - значение полинома (в точке "Х"); ' P - значение производной (в точке "Х"). P = 0 ' Значение производной в точке Y = A(0) ' Значение полинома в точке FOR K As Integer = 1 TO N P = P * X + Y Y = Y * X + A(K) NEXT END SUB ' ' P R O G R A M "TSPGRN" ' 11.09.87 '------------------------------------------------------------- ' Проверка вычисления значения и производной полинома '------------------------------------------------------------- 'DECLARE SUB PGRN (AR%, AR!(), AR!, AR!, AR!) ' Параметры полинома DATA 1., 0., -6., 1., 4. Dim N As integer = 4 DIM A(N) As single Dim As single Y1,P1,Y,P FOR J As integer = 0 TO N: READ A(J): NEXT PRINT " X YG PG YA PA" Dim F As string = " #.## ###.##### ###.##### ###.##### ###.#####" FOR X As Single= 0 TO 2.0 STEP 0.25 PGRN (N, A(), X, Y, P) ' Вычисления по аналитическим формулам Y1=1.* X^4 - 6.* X^2 + X + 4. P1=4.* X^3 - 12.* X + 1. PRINT USING F; X, Y, P, Y1, P1 NEXT Sleep
Стиль программирования я менять не стал. Если бы вы не поленились и почитали учебник, то без труда сами, еще быстрее меня, переписали пример с Qbasic (Ведь я Qbasic практически не знаю)
Цитата Конечно, не обиделся, спасибо! Так мы продолжим диалог или разбегаемся?
Это вам решать, я то все равно здесь останусь
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
|