Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75

Приближение полиномами Чебышева

21.05.2016, 13:01. Показов 8006. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно програмно реализовать приближения (интерполяцию) функции полинонами Чебышева. Т.е. у нас есть n-ое количество пар x,y, и нужно по заданному x получить приблизительный y.

Приближающая функция ищется в виде суммы многочленов Чебышева, формулы во вложениях.

Пробовал реализовать, пока безуспешно:
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
 public class Polynom
    {
        public double[] X { get; set; }
        public double[] Y { get; set; }
 
        public Polynom(double[] x, double[] y)
        {
            X = x;
            Y = y;
        }
 
        public Polynom(List<DoublePoint> list)
        {
            X = new double[list.Count];
            Y = new double[list.Count];
            int j = 0;
            foreach (var i in list)
            {
                X[j] = i.X;
                Y[j] = i.Y;
                j++;
            }
        }
 
        public double GetY(double x)
        {
            double res = GetRatio(0, X.Length) * (1 / Math.Pow(2, 0.5)); //отдельно считаем первое слогаемое (для Т с тильдой)
            for (int i = 1; i < X.Length - 1; i++)
            {
                res += (GetRatio(i, X.Length) * GetChebPolynom(x, i)); //сумма многочленов
            }
            return res; 
        }
 
        public double GetChebPolynom(double x, long n) //считаем многочлен
        {
            if (n == 1) return x;
            double result = Math.Cos(n * Math.Acos(x));
            return result;
        }
 
        public double GetRatio(double j, double n)
        {
            double res = Y[0] * 1; //отдельно считаем первое слогаемое (для Т без тильды)
        for (var i = 1; i < n - 1; i++)
            {
                res +=  Y[i] * GetChebPolynom(X[i], (long)j);
            }
            return res * 2 / n;
        }
 
    }
Класс DoublePoint:

C#
1
2
3
4
5
6
7
8
9
10
11
public class DoublePoint : IComparable
{
    public double X { get; set; }
    public double Y { get; set; }
 
    public DoublePoint(double x, double y)
    {
        X = x;
        Y = y;
    }
}
Пожалуйста, укажите мне на мои ошибки. Буду рад любой помощи.

Возможно, я не до конца понял этот метод. Ведь я так и не понял, для чего формула, которая вычисляет Xj. И не знаю, правильно ли я считаю полиномы.

Заранее спасибо.
Миниатюры
Приближение полиномами Чебышева  
Изображения
 
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2016, 13:01
Ответы с готовыми решениями:

Приближение полиномами Чебышева
Здравствуйте. Возникла необходимость написать программу приближения функции полиномами Чебышева. Т.е. я ввожу n-ое количество пар x,y, а...

Аппроксимация полиномами
Такая проблема: аппроксимировал значения при помощи fit type и получил следующие коэффициенты. Но мне необходимо получить матрицу Z. Для...

Интерполяция полиномами Лагранжа
Здравствуйте. Помогите пожалуйста. В С# требуется реализовать программу интерполяции полиномами Лагранжа. Если кто-нибудь сможет -...

42
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.05.2016, 10:17
Студворк — интернет-сервис помощи студентам
Коэффициенты полиномов Чебышева можно найти только для известной функции
Для таблично заданных функций используются другие методы

Добавлено через 6 минут
или если известны значения функции в корнях полиномов, что впрочем одно и то же, так как что бы найти эти значения вам должна быть известна функция
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 10:24  [ТС]
Нашел формулу, где показано куда применять эти узлы.
http://storage.library.opu.ua/... valov_.pdf, страница 65.
Переделал программу под эту формулу. Но результат опять неудовлетворительный
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
public class Polynom
    {
        public double[] X { get; set; }
        public double[] Y { get; set; }
 
        public Polynom(double[] x, double[] y)
        {
            X = x;
            Y = y;
        }
 
        public Polynom(List<DoublePoint> list)
        {
            X = new double[list.Count];
            Y = new double[list.Count];
            int j = 0;
            foreach (var i in list)
            {
                X[j] = i.X;
                Y[j] = i.Y;
                j++;
            }
        }
        public double GetY(double x)
        {
            double res = 0;
            for (int i = 0; i < X.Length - 1; i++)
            {
                res += (GetRatio(i, X.Length) * GetChebPolynom(x, i));
            }
            return res;
        }
 
        public double GetChebPolynom(double x, long n) 
        {
            if (n == 0) return 1/Math.Pow(2, 0.5);
            if (n == 1) return x;
            return  (Math.Pow(x + Math.Pow(Math.Pow(x, 2) - 1, 0.5), n) + Math.Pow(x - Math.Pow(Math.Pow(x, 2) - 1, 0.5), n))/ 2.0;
        }
 
        public double GetRatio(double j, double n)
        {
            double res = 0; 
            for (var k = 1; k < n; k++)
            {
                res += Y[(int) j] * GetChebPolynom( Math.PI*(2*k-1)/2*n, (long)j);
            }
            return res * 2 / n;
        }
    }
 
    public class DoublePoint : IComparable
    {
        public double X { get; set; }
        public double Y { get; set; }
 
        public DoublePoint() { }
 
        public DoublePoint(double x, double y)
        {
            X = x;
            Y = y;
        }
    }
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.05.2016, 10:38
Вы что не замечаете что ли что в формуле для коэффициентов разложения - aj присутствуют значения функции -f(xj) в нулях полиномов? А для того что бы их найти вам должна быть известна эта самая функция - f(x)
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 10:45  [ТС]
Ага. Я просто рассуждал, что x_j это узлы нашей функции, а не корни полинома. Ведь значения f(x_j) этих узлов нам известно.
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 10:52  [ТС]
Погодите-ка. А разве корни полинома не здесь считаются (pi * (2k-1)/2n?
Миниатюры
Приближение полиномами Чебышева  
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.05.2016, 10:58
это условная запись этих нулей, см стр.62
Миниатюры
Приближение полиномами Чебышева  
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 11:00  [ТС]
afront, т. е. там где f (x_j) в приведенной выше формуле, я должен считать f (x_m) по вашей формуле?
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.05.2016, 11:04
Milkho, я не знаю, что вы должны писать, извините, я не смотрел ваш код. Проще написать заново, чем разбираться в чужих ошибках))
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 11:10  [ТС]
я сейчас не о коде говорю, а о расчетах. Нужно считать функцию от x_j, как от x_m. Это, получается, значение функции в корнях полинома?
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.05.2016, 11:20
расчеты это и есть код)) считать нужно так как я вам написал, я же прислал вам рабочий код
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 11:34  [ТС]
Я в затруднении. Мне нужно интерполировать таблично заданную функцию. Я надеялся осуществить это с помощью полиномов Чебышева. Но, если они предназначены лишь для аналитических функций, они мне не подходят. Нужно использовать другой метод и это все при том, что интерполяцию полиномами Лагранжа, Ньютона, Эрмита и сплайн-интерполяцию мне использовать нельзя.
Скажите, вы не могли бы мне подсказать, какой же метод мне выбрать вместо Чебышевского?
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.05.2016, 12:12
Есть еще обычная линейная интерполяция и барицентричечкая
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
  class Program
    { 
           
  
        public static double LinearInterpolation(double[] x, double[] y, double xval)
        {
            double yval = 0.0;
            for (int i = 0; i < x.Length - 1; i++)
            {
                if (xval >= x[i] && xval < x[i + 1])
                {
                    yval = y[i] + (xval - x[i]) * (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
                }
            }
            return yval;
        }
 
        public static double[] LinearInterpolation(double[] x, double[] y, double[] xvals)
        {
            double[] yvals = new double[xvals.Length];
            for (int i = 0; i < xvals.Length; i++)
                yvals[i] = LinearInterpolation(x, y, xvals[i]);
            return yvals;
        }
 
        public static double BarycentricInterpolation(double[] x, double[] y, double xval)
        {
            double product;
            double deltaX;
            double bc1 = 0;
            double bc2 = 0;
            int size = x.Length;
            double[] weights = new double[size];
 
            for (int i = 0; i < size; i++)
            {
                product = 1;
                for (int j = 0; j < size; j++)
                {
                    if (i != j)
                    {
                        product *= (x[i] - x[j]);
                        weights[i] = 1.0 / product;
                    }
                }
            }
 
            for (int i = 0; i < size; i++)
            {
                deltaX = weights[i] / (xval - x[i]);
                bc1 += y[i] * deltaX;
                bc2 += deltaX;
            }
            return bc1 / bc2;
        }
 
        public static double[] BarycentricInterpolation(double[] x, double[] y, double[] xvals)
        {
            double[] yvals = new double[xvals.Length];
            for (int i = 0; i < xvals.Length; i++)
                yvals[i] = BarycentricInterpolation(x, y, xvals[i]);
            return yvals;
        }
 
  
 
        static void TestBarycentric()
        {
            double[] xdata = new double[] { 0, 4, 8, 12, 16 };
            double[] ydata = new double[] { 0, 8, 32, 72, 128 };
            double[] x = new double[] { 2, 6, 10, 14 };
            double[] y = BarycentricInterpolation(xdata, ydata, x);
 
            Console.Clear();
            Console.WriteLine("Running Barycentric Interpolation Test\n\n");
            Console.WriteLine(" x = {0}", x);
            Console.WriteLine(" y = {0}", y);
            Console.WriteLine("Press ENTER key to continue...");
            Console.ReadLine();
        }
 
        static void Print(double[] array)
        {
            for (int i = 0; i < array.Length; i++)
                Console.Write(array[i] + @" ");
            Console.WriteLine();
        }
 
     
 
        static void Main(string[] args)
        {
            double[] xdata = new double[] { 1, 3, 5, 7, 9 };
            double[] ydata = new double[] { 2, 6, 10, 14, 18 };
 
            double[] x = new double[] { 2, 4, 6, 8 };
            double[] y = LinearInterpolation(xdata, ydata, x);
            
            Console.WriteLine(" Linear Interpolation Test\n\n");
            Console.WriteLine(" X ");
            Print(x);
            Console.WriteLine(" Y");
            Print(y);
  
 
 
            xdata = new double[] { 0, 4, 8, 12, 16 };
            ydata = new double[] { 0, 8, 32, 72, 128 };
 
            x = new double[] { 2, 6, 10, 14 };
            y = BarycentricInterpolation(xdata, ydata, x);
 
 
            Console.WriteLine(" Barycentric Interpolation Test\n\n");
            Console.WriteLine(" X ");
            Print(x);
            Console.WriteLine(" Y");
            Print(y);
 
 
            Console.ReadLine();
 
        }
    }
Добавлено через 8 минут
Правда барицентрическая интерполяция это вариант полиномиальной интерполяции(Лагранжевской) - только более быстрый и стабильный
1
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 13:39  [ТС]
afront, А если вернуться к Чебышёву и интеполировать, скажем, ту же функцию cos(x) но на произвольном интервале? Как это осуществить?
Хотелось бы, чтобы n тоже было произвольным. Потому что если для n=5 график вполне нормальный, то чем больше n, тем хуже график. Я так понял, это связано с высокой степенью полинома.
Мне бы хотелось иметь параметр, который будет отвечать за количество точек, по которых строится график.
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 13:41  [ТС]
***
Миниатюры
Приближение полиномами Чебышева   Приближение полиномами Чебышева  
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.05.2016, 13:49
как N так и граница интервала А, В задаются в исходных данных, поэтому можно код приведенный в головной программ вынести в отдельную функцию у которой они будут параметрами
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 13:56  [ТС]
afront, Если изменять какие-либо параметры (a,b,n) график строится неправильно. Может дело в шаге, по которому опередляются узлы?
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.05.2016, 14:00
это значит что где то ошибка. В методе ПЧ нет понятия шаг, только количество узлов N и границы А, В
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 14:05  [ТС]
afront, можете скинуть эти функции в си?
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
22.05.2016, 14:06
я не пишу на С
0
4 / 4 / 3
Регистрация: 24.07.2015
Сообщений: 75
22.05.2016, 14:07  [ТС]
afront, нет, вы говорили, что исходники есть на си/фортране, а вы переделали их на си шарп.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.05.2016, 14:07

Интерполяция тригонометрическими полиномами
Всем привет. В общем такая тема - нужно сделать в маткаде проверку работы программы (интерполяция тригонометрическими полиномами) в...

Интерполяция полиномами Лагранжа
Вобщем на я ве раньше не писал, да и в матетматике не силён. Разобрался с заданием, нашёл кучу примеров и т.п. вроде всё нормально, но...

Операции над полиномами
Какие есть операции над полиномами?

Интерполяция полиномами Лагранжа
Помогите пожалуйста. В С# требуется реализовать программу интерполяции полиномами Лагранжа. Чтобы все данные вводились с консоли.

Кривая Безье с полиномами Берштейна
Доброго времени суток. Захотел рассчитать и нарисовать кривую Безье. Вот ссылка на...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru