Аватар для .Lexx.
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157

Итерации - реализация интерполяции Лагранжа

29.08.2011, 08:53. Показов 6023. Ответов 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 файл с массивом значений, потом над ним проводятся вычисления и автоматом записывается в ту же дерикторию, что и первый, с добавлением к имени слова.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace interpol2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            openFileDialog1.DefaultExt = "txt";
            openFileDialog1.Filter = ".txt|*.txt";
            openFileDialog1.Title = "Open file";
            openFileDialog1.Multiselect = false;
            openFileDialog1.FileName = string.Empty;
        }
 
        string FNwithExten = string.Empty;
        string newFNwithExten = string.Empty;
        string FN = string.Empty;
        string Dir = string.Empty;
        int QuantBeat = 0;
        int nom = 0;
        int newQB = 0;
 
        /////////////////////////////////////////
        //обработчик для дроби в правой части
        double drob(double xp, int step)
        {
            int[] time = new int[6];
            double chesl = 1;
            double znam = 1;
            for (int i = 0; i == 5; i++) { if (i == step) { continue; } chesl *= xp - i; }
            for (int i = 0; i == 5; i++) { if (i == step) { continue; } znam *= step - i; }
            return chesl / znam;
        }
        // здесь фактический обработчик массива
        void Execute(double[] arrvx, double[] arrvix, int sizevx, int kolyzlov)  
        {
            int count = 0;
            double itog = 0;
            for (int i = 0; i != sizevx-6; i++)
            {
                if (i < 2) 
                {
                   for (int Nyzla = 0; Nyzla < kolyzlov; Nyzla++)
                    {
                        arrvix[count] = itog;
                        count++;
                   }               
                }
                else{
                  for (int Nyzla = 1; Nyzla < kolyzlov; Nyzla++)
                   {
                        for (int j = 0; j == 5; j++)
                       {
                            itog += arrvx[i + j] * drob(2+(Nyzla / kolyzlov), j);
                        }
 
                    }                           
                    arrvix[count] = itog;
                    count++; 
                }
            }
        }
        ////////////////////////////////////////
        private void bOpen_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    FNwithExten = openFileDialog1.FileName;
                    FN = Path.GetFileNameWithoutExtension(FNwithExten);
                    Dir = Path.GetDirectoryName(FNwithExten);
                    StreamReader SR = new StreamReader(FNwithExten);
                    lb1.Text = FNwithExten;
                    string Textfile = SR.ReadToEnd();
                    string[] LinesText=Textfile.Split(new Char[]{'\n',' '},StringSplitOptions.RemoveEmptyEntries);
                    QuantBeat = LinesText.Length;
                    double[] arr1 = new double[QuantBeat];
                    for (int i = 0; i < QuantBeat; i++)
                    {
                        arr1[i] = Convert.ToDouble(LinesText[i]);                    
                    }
                    try
                    {
                        nom=Convert.ToInt16(tb1.Text);
                        newQB = QuantBeat * nom;
                        double[] arr2=new double[newQB];
                        try
                        {
                            Execute(arr1,arr2,QuantBeat,nom);
                            newFNwithExten = Dir +"\\"+ FN + "_inter.txt";
                            using (StreamWriter SW = new StreamWriter(newFNwithExten))
                               {
                                foreach (int i in arr2){ SW.WriteLine(i); }
                               }
                        }
                        catch{lb2.Text ="bad solution";}
                    }
                    catch { lb2.Text = "Vi vvodite ne chislo ili ne celoe chislo"; }
 
                }
                catch { lb2.Text = "not reading"; }
            }
        }
 
        private void bClose_Click(object sender, EventArgs e)
        {
            Close();
        }
 
 
 
    }
}


При прогоне программы вижу, что значения в массив arr1 заносятся правильно, а вот в массив arr2 заносятся значения 0, но массив нужного размера получается.

Прошу кого-нибудь глянуть(если не западло) в чём закавыка(скорей всего в реализации формулы), но я просто не вижу что неправильно, потому как циклы вроде реализуются в правильной последовательности. Если вы считаете, что само описание формулы неправильное, то прошу поясните своё мнение.
заранее спасибо.
 Комментарий модератора 
На форуме есть редактор формул. Это просто чтобы Вы знали.
Миниатюры
Итерации - реализация интерполяции Лагранжа  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.08.2011, 08:53
Ответы с готовыми решениями:

реализация кубической интерполяции
Всем доброго времени суток! Возникла проблема с кубической интерполяцией (преобразуют матлабовский код на с#, а именно функцию...

Вопрос по интерполяции лагранжа
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; const MAX_points=20; void ShowTitle() clrscr(); cout&lt;&lt;&quot;Интерполяционный...

Оценить погрешность интерполяции многочленом Лагранжа и сплайнами
Господа, в наличии функция f(x)=-x^3. Необходимо оценить погрешность интерполяции многочленом Лагранжа и сплайнами. Где погрешность будет...

21
 Аватар для .Lexx.
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157
30.08.2011, 13:54  [ТС]
Студворк — интернет-сервис помощи студентам
теперь опять вопрос!!!!
опять про метод Drob. чтобы прослеживать значения числителя и знаменателя отдельно, поменял предыдущий код так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        double drob(double xp, int step)
        {               
            double chesl = 1;
            double znam = 1;
            for (int i = 0; i < 6; i++) {
 
                if (i != step)
                {
                    // result *= (xp - i)/(step-i);
                    chesl *= (xp - i);
                    znam *= (step - i);
                }
            }
            return chesl/znam;
        }


при прогоне значения chesl i znam менялись сильно, даже в watch кинул chesl/znam там точно нормальные значения бегают!!!!!
Почему же он возвращает 1?

almazsr, спасибки я заметил)
0
236 / 173 / 25
Регистрация: 13.11.2010
Сообщений: 425
30.08.2011, 18:00
.Lexx., до этого у вас цикл был неправильный, поэтому и возвращал 1. А сейчас вы же исправили.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2011, 18:00

Разработать подпрограмму для интерполяции полиномом Лагранжа.
Разработать подпрограмму для интерполяции полиномом Лагранжа. В маткаде...

Подскажите литературу по интерполяции функции двух переменных используя полиномы Лагранжа и Ньютона
Друзья подскажите литература по интерполяции функции двух переменных используя для этого полиномы Лагранжа и Ньютона.

Нужно сделать программу для интерполяции по формуле Лагранжа, y=Sin(x^3), границы от 0-2 с шагом 0,08. Почему не работае
#include &lt;math.h&gt; #include &lt;stdio.h&gt; #include &lt;process.h&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cmath&gt; #include...

Написать две программы для интерполяции функции по формулам Лагранжа при равномерном расположении узлов
Доброго времени суток. Помогите, пожалуйста. Есть такое задание: написать две программы для интерполяции функции по формулам Лагранжа...

Разработать алгоритм интерполяции значений функции методом Лагранжа. В качестве тестового примера использовать функцию Рунге
Народ срочно нужна помощь в написании программы. Тема : Разработать алгоритм интерполяции значений функции методом Лагранжа. В качестве...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru