Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.79/28: Рейтинг темы: голосов - 28, средняя оценка - 4.79
 Аватар для .Lexx.
5 / 5 / 1
Регистрация: 06.07.2011
Сообщений: 157

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

29.08.2011, 08:53. Показов 5968. Ответов 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
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru