|
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
|
||||||||||||
Итерации - реализация интерполяции Лагранжа29.08.2011, 08:53. Показов 5801. Ответов 21
Метки нет (Все метки)
Здравствуйте.
Дали задание реализовать интерполяционную формулу Лагранжа(на рисунке ниже). Так вот в левой части т.е. У(х) - это значение нового элемента нового массива. в правой части: у - 6 элементов (в моём случае) из старого массива, которые при просчёте постепенно сдвигаются(т.е. сначала 0-5, потом 1-6, 2-7, 3-8 и т.д до момента n-6 - n), фактически в каждый момент расчёта мы работаем со вторым элементом(средний промежуток) сдвигаемого массива. ля первых 2 промежутков (0-1 и 1-2) мы делаем линейную интерполяцию. х - это узлы, для расчёта У(х), т.е. если мы первоначальные промежутки делим на 4, то х будет 2, 2.25, 2.5 и 2.75(в программе этот момент 2+(Nyzla / kolyzlov)) Сама же программа должна делать следующее: есть textbox(у меня tb1), в который вводится число, обозначающее то кол-во на которое будем разбивать первичный массив. есть кнопка, по нажатию которой мы выбираем через openfiledialog .txt файл с массивом значений, потом над ним проводятся вычисления и автоматом записывается в ту же дерикторию, что и первый, с добавлением к имени слова.
При прогоне программы вижу, что значения в массив arr1 заносятся правильно, а вот в массив arr2 заносятся значения 0, но массив нужного размера получается. Прошу кого-нибудь глянуть(если не западло) в чём закавыка(скорей всего в реализации формулы), но я просто не вижу что неправильно, потому как циклы вроде реализуются в правильной последовательности. Если вы считаете, что само описание формулы неправильное, то прошу поясните своё мнение. заранее спасибо.
0
|
||||||||||||
| 29.08.2011, 08:53 | |
|
Ответы с готовыми решениями:
21
реализация кубической интерполяции Вопрос по интерполяции лагранжа Оценить погрешность интерполяции многочленом Лагранжа и сплайнами |
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
|
| 29.08.2011, 11:51 | |
|
либо я что-то путаю, либо вы..
на сколько я помню ничего сдвигать не надо суть метода такова - есть массив из N точек и по этим точкам вы строите полином N-ой степени по формуле Лагранжа) вы её привели в посте. как я вижу решение задачи: пишете какой-то метод, в который вы подаете массив с данными и переменную X - он, в свою очередь у себя строит этот полином и выдает вам значение аппроксимированной функции в данной точке.
0
|
|
|
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
|
|
| 29.08.2011, 12:15 [ТС] | |
|
спасибо, что отозвались!!
Под сдвигом я имел ввиду, что при каждом прогоне мы работаем только с 6 элементами входного массива. Я вот поэтапно прогонял массив и заметил, что в выходной массив подаётся значение itog, объявленное в методе как 0. Т.е. тупо переназначив его на 10, в файле теперь сплошником 10 идут. Почему-то не прогоняется строка: Код C# 64 itog += arrvx[i + j] * drob(2+(Nyzla / kolyzlov), j); пожалуйста гляньте этот момент, в чём ошибка. Вроде все правила соблюдены!!!!
0
|
|
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
||||||||||||||||||||||||||
| 29.08.2011, 12:39 | ||||||||||||||||||||||||||
|
а зачем такие танцы?
нужно ведь, имея набор точек, аппроксимировать их какой-то функцией, в данном случае полиномом Лагранжа если вы проходите поэтапно со сдвигом на 1 элемент, то в итоге вы получите немного разные массивы. тоесть аппроксимация в точках, которые пересечены в множестве при предыдущем и нынешнем проходе, будут иметь разные значения. это я по поводу вашего подхода к решению задачи. если уж вы хотите уточнить, то, во-первых, с увеличением количества точек увеличивается точность аппроксимации, во-вторых, если уж вы хотите аппроксимировать частями, то вам следует аппроксимировать непересекающиеся множества - [0; 10]:[11; 20]:...:[n-10; n] и потом их склеивать. в идеале склеивать по значению производной в точке склеивания, но это уже почти метот спланов и не всегда у вас есть значения производной в точках. по поводу кода - пройдите пошагово (если ещё не проходили, конечно) и ещё.. смотрите: у вас массив arr1 заполняется в цикле:
массив же arr2 у вас просто инициализируется:
на сколько я догадываюсь вы хотите чтобы после использования метода
но они у вас в итоге не меняются. они так и остаются как были до использования метода Execute. сделайте передачу в этот метод массивов по ссылке (сейчас вы передаете их по значению)
0
|
||||||||||||||||||||||||||
|
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
|
|
| 29.08.2011, 12:55 [ТС] | |
|
я думал, что, вызывая метод Execute, я передаю в него массив arr1, который обрабатывается методом и выкидывает новое значение в arr2. Прогоняя программу, заметил, что почему -то проскакивается мимо вычисление itog:
Код C# 1 2 3 itog += arrvx[i + j] * drob(2+(Nyzla / kolyzlov), j); Кроме того, если при инициализации itog приравнять 10, то в получившемся файле первые несколько значений, отвечающие требованию: Код C# 1 for (int i = 0; i != sizevx-6; i++) { if (i < 2) { for (int Nyzla = 0; Nyzla < kolyzlov; Nyzla++) { arrvix[count] = itog; count++; } получаются равными 10, а потом опять 0 сплошником. Прочитав ваше последнее сообщение, попробовал сделать, используя ref. Всё так же 0. ещё раз прошу гляньте на вычисление itog!!!
0
|
|
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
|
| 29.08.2011, 13:18 | |
|
давайте свой проект - я его подебажу.. если не получится сейчас, то уже дома. если не хотите светить его на форуме, то в личку скиньте ссылку на выложенный архив
либо сами пройдитесь по нему пошагово и проверьте значения переменных - может там условие не выполняется пробуйте
1
|
|
|
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
|
||||||
| 29.08.2011, 13:25 | ||||||
|
.Lexx., надеюсь я правильно понимаю, что вам нужен метод Лагранжа? Зачем тогда так мудрить. Я полгода назад писал подобное. Посмотрите этот код, здесь вы можете задать равномерные или оптимальные узлы, функцию в явном виде (для проверки) или массив значений. Потом его можно дополнить до полинома Эрмита.
1
|
||||||
|
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
|
||||||
| 29.08.2011, 14:08 [ТС] | ||||||
|
кажись воткнул в чём ошибка, исправлю -> отпишусь. Спасибо всем))))
Добавлено через 15 минут Хотел бы задать вопрос по поводу последнего кода:
0
|
||||||
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
|
| 29.08.2011, 14:14 | |
|
первое два - конструкторы.
base - использование конструктора родителя и дополнение того, чего нет в конструкторе родителя. третье - поле, которое выдает дабловый массив, который является приватным и к нему нет прямого доступа
2
|
|
|
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
|
|||||||||||
| 29.08.2011, 14:40 [ТС] | |||||||||||
|
almazsr вопрос:
Для работы с массивом вы используете этот вариант:
и ещё в BasisPolynomial вы используете _nodes[], потому что заранее не знаете с каким значением будете работать?? Т.е. будет ли ошибкой если я сделаю вот так:
0
|
|||||||||||
|
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
|
|
| 29.08.2011, 15:01 | |
|
.Lexx., у вас функция drob возвращает всегда 1.
0
|
|
|
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
|
|
| 29.08.2011, 15:30 [ТС] | |
|
простите. но я чего-то не воткнул(( Почему 1? вы вместо моего используете, как я понимаю массив значений, и каждый раз работаете с его элементами, так??
мне просто объяснили, что при расчёте мы работаем с 6 элементами, поэтому и цикл должен быть от 0 до 5, с выкидыванием элемента = нынешнему шагу. поэтому я тупо сделал вычитание переменных (xp-i)(step - i) или я не прав?
0
|
|
|
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
|
||||||
| 29.08.2011, 19:09 | ||||||
|
.Lexx.,
1
|
||||||
|
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
|
|
| 30.08.2011, 08:18 [ТС] | |
|
almazsr, а если я сделаю что-то типа того for(int i=0;i<6;i++) так будет норм или же дело не в присваивании:???
0
|
|
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
|
| 30.08.2011, 09:48 | |
|
Цикл for повторно выполняет оператор или блок операторов, пока определенное выражение не примет значение false. Цикл for удобно использовать для итераций в массивах и для последовательной обработки.
у вас же это значение при первой де итерации принимает значение false да, будет нормально
1
|
|
|
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
|
||||||
| 30.08.2011, 12:04 [ТС] | ||||||
|
Прошу простить мене за тупизм!!!
но вот сделал метод:
Просто по-моему я не допускал ошибки. Если допустил поясните плиззззз.
0
|
||||||
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
||||||
| 30.08.2011, 12:46 | ||||||
0
|
||||||
|
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
|
|
| 30.08.2011, 13:03 [ТС] | |
|
точняк, теперь просчитывает. Но почему нужна конвертация??? Стоп. Из-за того что в итоге получаем число не int, а double поэтому??
Далее как и говорил almazsr действительно не меняется значение метода Drob, хотя по любому должно. Имеет смысл значения в нём тоже в double конвертировать????
0
|
|
|
мастер топоров
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
|
|
| 30.08.2011, 13:08 | |
|
тут я точно не скажу, по идее если делятся int на int, то может получиться и double - это должно быть предусмотрено в переопределении операции для типа int, но раз уж вы подаете в метод double, то чтобы не возникало проблем приведите всё, что можно к double.
0
|
|
|
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
|
|
| 30.08.2011, 13:52 | |
|
.Lexx., достаточно одну из переменных привести к double при делении и тогда будет уже нормальное деление, а не целочисленное.
0
|
|
| 30.08.2011, 13:52 | |
|
Помогаю со студенческими работами здесь
20
Разработать подпрограмму для интерполяции полиномом Лагранжа. Подскажите литературу по интерполяции функции двух переменных используя полиномы Лагранжа и Ньютона Нужно сделать программу для интерполяции по формуле Лагранжа, y=Sin(x^3), границы от 0-2 с шагом 0,08. Почему не работае
Разработать алгоритм интерполяции значений функции методом Лагранжа. В качестве тестового примера использовать функцию Рунге Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Рецензия / Мнение/ Перевод
https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs
. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|