0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 6
|
|
1 | |
Формирование одномерного массива по заданному условию внутри процедуры19.04.2015, 13:59. Показов 3499. Ответов 13
Метки нет (Все метки)
Задача: Функция F(x) определена с помощью ряда .
Из заданного массива Y выделить и упорядочить по возрастанию только те элементы, для которых заданная точность вычисления достигается при суммировании не более M слагаемых. Сложность возникла на моменте формирования массива из элементов исходного(Y) которые прошли через условие на количество слагаемых, пожалуйста подскажите как выполнить этот фрагмент задачи в виде процедуры, обрабатывающей входной массив переменной длинны и выдающей массив прошедших условие или как сформулировать условие так, чтобы этот этап решения был максимально рационален. Лучший вариант который приходит в голову это сначала прогнать весь массив Y и посчитать количество элементов выходного массива, затем как-то (вероятно с помощью нетипизированнного формального параметра массива) в процедуре сформировать этот самый массив еще раз прогоняя весь Y.
0
|
19.04.2015, 13:59 | |
Ответы с готовыми решениями:
13
Формирование одномерного массива по условию Формирование одномерного массива по условию Формирование одномерного массива по условию Формирование нового массива по заданному условию |
Модератор
9860 / 5230 / 3304
Регистрация: 17.08.2012
Сообщений: 15,998
|
|
20.04.2015, 15:14 | 2 |
В турбо паскале работа с динамическими массивами (которые переменной длины) реализуется через танцы с бубном. Может быть, Вам подойдёт статический массив с длиной, гарантированно не меньшей необходимой?
0
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 6
|
||||||
20.04.2015, 22:35 [ТС] | 3 | |||||
Т.е. делаю формальные переменные без типа, а затем использую преобразование типа?
Кликните здесь для просмотра всего текста
При такой реализации у меня получается не до конца заполненный значениями массив, попадающий на обработку в другую подпрограмму, не знаю из-за этого или нет, получаю ошибку Err 205.
0
|
Модератор
9860 / 5230 / 3304
Регистрация: 17.08.2012
Сообщений: 15,998
|
||||||
21.04.2015, 00:00 | 4 | |||||
Именно. И, к сожалению, в подпрограмму в этом случае обязательно требуется так же передавать (и использовать в ней) и размер (размеры) массива, во избежание возникновение ошибки из-за попадания в подпрограмму неинициализированных данных (ошибка 205 - это переполнение разрядной сетки при операции с плавающей точкой, наиболее распространённые - деление на 0 и вычисление ln(x) при x <= 0).
Добавлено через 1 час 8 минут Ох, батюшки светы... Только сейчас заметил... Что это у Вас за препоганейшая реализация Вашей функции sumf? Подобные вычисления нужно делать с помощью рекуррентного соотношения, а не возводить в целочисленную степень с помощью логарифма. Ещё и "c" может быть <= 0, вот Вам и 205 из-за логарифма. Хотя бы вот так надо, безо всяких там логарифмов:
1
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 6
|
|
21.04.2015, 20:24 [ТС] | 5 |
Добился таки нормального запуска программы, однако цикл вычисления суммы зацикливается. Воткнул перед ним оператор вывода значения C. Прога выплюнула какое-то сумасшедшее по размерам отрицательное значение, видимо передача значения идет как-то не так, не знаю как решить эту проблему.
0
|
Модератор
9860 / 5230 / 3304
Регистрация: 17.08.2012
Сообщений: 15,998
|
|
22.04.2015, 09:09 | 6 |
Сегодня вечером решу Вашу проблему. Скажу сразу: extended здесь не нужен, хватит и real (или, лучше, double, поскольку он во всех паскалях соответствует стандарту IEEE 754, который фактически родной для интеловских процессоров). Нетипизированные параметры процедур здесь не требуются, хватит и типизированных, а лучше применить открытые массивы. Далее. У меня есть подозрение, что в массив "y" Вы вводите что попало, а, между тем, Ваш ряд сходится на интервале [-1..1]. При вводе значений вне этого диапазона будет в лучшем случае зацикливание, а вообще - по-любому - переполнение разрядной сетки числа с плавающей точкой.
0
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 6
|
|
22.04.2015, 14:21 [ТС] | 7 |
Забыл сказать, что в том экземпляре кода который отправил сюда нашел ошибку, в процедуру fillap не передавались значение точности, исправил, и требование к обработке массивов произвольной длины в подзадачах и использвания для этого нетипизированных формальных параметров нам устанавлили жестко. После исправления забивал весь массив числами [0.1..1],точность задавал 0.01 и получал вышеописанный результат.
0
|
Модератор
|
|
23.04.2015, 08:41 | 8 |
goblinuss,
это внутри процедуры массив произвольной длины, но передают-то туда снаружи вполне определенное количество значений, с учетом уже упомянутых открытых массивов нет причин для беспокойства. Cyborg Drone, я бы говорил о [-1,0], поскольку 1) речь о малых, по сравнению с бесконечностью, n; 2) в этом диапазоне ряд знакопеременный убывающий, следовательно, погрешность не превысит первого отброшенного члена. Для (0,1] ряд знакопостоянный, сходится при n->бесконечности, но при малых n оценивать погрешность по значению члена знакопостоянного ряда нельзя, если правильно путаю, нужно считать предел суммы отброшенных членов.
1
|
Модератор
9860 / 5230 / 3304
Регистрация: 17.08.2012
Сообщений: 15,998
|
|
23.04.2015, 16:58 | 9 |
bormant, правильно. При положительном x сумма ряда при оценке величины последнего члена будет посчитана неверно. Но, в принципе, ничего страшного, погрешность получится второго порядка малости. Итак, тряхну стариной.
Возьмём предельный случай x=1. Тогда имеем ряд Оценка остатка ряда, исходя из интегрального признака Коши: И тогда получается, что Поскольку при n>1 для оценки достижения требуемой точности вычислений можно использовать сравнение погрешности с очередным членом ряда, поскольку, как правило, сумма из одного члена ряда вычисляется до цикла суммирования, а, начиная со второго члена, остаток ряда не менее очередного члена ряда. Но, если быть точным, то для x>0 для очередного члена ряда a нужно применять оценку
0
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 6
|
|
23.04.2015, 20:58 [ТС] | 10 |
Как в итоге заставить код работать сохранив использование преобразование типа в подзадачах?
0
|
Модератор
9860 / 5230 / 3304
Регистрация: 17.08.2012
Сообщений: 15,998
|
|
24.04.2015, 15:42 | 11 |
Оценка остатка ряда для положительного x вызывает затруднение. Оценка остатка ряда при 0<x≤1:
Да, конечно, можно интегральную показательную функцию разложить в ряд Тейлора: где γ - постоянная Эйлера, да вот беда: при больших n сходимость этого ряда мерзчайшая. Ну и... Как будем делать критерий окончания вычислений? По-честному или как попало?
0
|
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 6
|
|
24.04.2015, 20:32 [ТС] | 12 |
Давайте как попало, честный вариант я не потяну.
0
|
Модератор
|
||||||
25.04.2015, 21:05 | 13 | |||||
Я б как-то так делал (коррекция точности для знакопостоянного ряда все ещё требуется):
0
|
Модератор
9860 / 5230 / 3304
Регистрация: 17.08.2012
Сообщений: 15,998
|
|
25.04.2015, 22:43 | 14 |
bormant, не нужно корректировать eps. В данном случае, если x=0, то количество слагаемых считать равным 1, если нет - находить оценку остатка ряда. Для отрицательного x оценка остатка меньше, чем модуль следующего члена, для положительных я тут пошерстил немного, кое-что нашёл... Фрипаскалевская ALGLIB Free Edition библиотека: http://www.alglib.net/. Из неё можно много чего полезного взять, в том числе и Ei(x), которая там вычисляется, похоже, с помощью аппроксимации по Чебышеву. Но не получается пока, что-то я, наверное, в исчислении несобственного интеграла где-то ошибаюсь... Или вовсе с критерием Коши намудрил... Не знаю, что-то как-то не сходится ряд из остатков ряда... Буду думать, может, что и придумаю.
1
|
25.04.2015, 22:43 | |
25.04.2015, 22:43 | |
Помогаю со студенческими работами здесь
14
Двуменые Массивы.Формирование одномерного массива из двумерного массива по условию Сортировка элементов одномерного массива по заданному условию Формирование одномерного массива Формирование одномерного массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |