Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408

Реализация функции MS Excel "ПРЕДСКАЗ"

19.08.2015, 16:07. Показов 2538. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
https://support.office.com/ru-... u-RU&ad=RU

У кого-нибудь имеется готовая реализация функции на С#?
Знаю как использовать функцию в своей программе через
Microsoft.Office.Interop.Excel и WorksheetFunction. Но, хотелось бы, целиком на C#.
Сам еще написать не пробовал, формулы не сложные вроде, но, вдруг у кого готовое решение завалялось.

Добавлено через 1 час 2 минуты
Сам разобрался. Нашел на буржуйском форуме.
http://forums.codeguru.com/sho... t-function
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
using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            double[] x_Values = {20, 28, 31, 38, 40};
            double[] y_Values = { 6, 7, 9, 15, 21 }; 
            double x_Avg = 0f;
            double y_Avg = 0f;
 
            double forecast = 0f;
            double b = 0f;
            double a = 0f;
            double X = 0f; // Forecast
 
            double tempTop = 0f;
            double tempBottom =0f;
            
            // X
            for (int i = 0; i < x_Values.Length; i++)
            {
                x_Avg+= x_Values[i]; 
            }
            x_Avg /= x_Values.Length;
 
            // Y
            for (int i = 0; i < y_Values.Length; i++)
            {
                y_Avg+= y_Values[i]; 
            }
            y_Avg /= y_Values.Length;
 
            for (int i = 0; i < y_Values.Length; i++)
            {
                tempTop += (x_Values[i] - x_Avg) * (y_Values[i] - y_Avg);
                tempBottom += Math.Pow(((x_Values[i] - x_Avg)), 2f);
            }
 
 
            b = tempTop / tempBottom;
            a = y_Avg - b * x_Avg;
 
            X = 30f;
            forecast = a + b*X;
 
            Console.WriteLine("Forecast of " + X.ToString() + " is: " + forecast.ToString());
            Console.Read();
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.08.2015, 16:07
Ответы с готовыми решениями:

Реализация функции Excel СТАВКА
Эта финансовая функция, может есть у кого эта функция в коллекции?:) Или может есть какие классы с готовыми финансовыми функциями?

Реализация собственной функции Excel РАБДЕНЬ на языке 1с
Здравствуйте. Очень нужно реализовать алгоритм нахождения даты рабочего дня, отстоящей от указанной начальной даты на заданное количество...

Реализация стандартной функции Excel ВЫБОР на VBA
Здравствуйте! Помогите пжлста реализовать стандарную функцию excel &quot;ВЫБОР&quot;.

6
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.08.2015, 16:36
Лучший ответ Сообщение было отмечено Woldemar89 как решение

Решение

Woldemar89, это называется линейная регрессия МНК. Тем более по ссылке сами же привели формулу

Название: 8e8ca310-3d42-4762-b3be-8dde84e87758.gif
Просмотров: 72

Размер: 1,019 байт

Тупо берем формулу, записываем математические операторы с помощью C# и получаем ожидаемый результат:
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
using System;
using System.Linq;
 
class Program
{
    private static void Main()
    {
        double[] x = { 20, 28, 31, 38, 40 };
        double[] y = { 6, 7, 9, 15, 21 };
 
        Func<double, double> forecast = GetForecast(x, y);
 
        Console.WriteLine(forecast(30));
    }
 
    private static Func<double, double> GetForecast(double[] x, double[] y)
    {
        if (x.Length != y.Length)
            throw new ArgumentException("x.Length != y.Length");
        var avgX = x.Average();
        var avgY = y.Average();
 
        double top = 0, bot = 0;
        for (int i = 0; i < x.Length; i++) // Sum
        {
            var dx = x[i] - avgX; 
            top += dx*(y[i] - avgY); // (x - |X|) * (y - |Y|)
            bot += dx*dx;  // (x - |X|)^2
        }
 
        var b = top / bot;
        var a = avgY - b*avgX;
        return xArg => a + b*xArg;
    }
}
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.08.2015, 16:50  [ТС]
Я не люблю математику, а кодить ее особенно - поэтому решил найти готовое решение.
Я сам, тот еще быдлокодер, Ваш код мне мозг подвзорвал немного
Цитата Сообщение от Psilon Посмотреть сообщение
return xArg => a + b*xArg;
Это че ваще? Я понял что лямбда, но она какая то рекурсивная.
И как 30 передается как параметр? Куда точнее?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.08.2015, 17:39
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Я не люблю математику, а кодить ее особенно - поэтому решил найти готовое решение.
Я сам, тот еще быдлокодер, Ваш код мне мозг подвзорвал немного
Ну тогда странно, что программированием решили заняться, т.к это та же математика, только другими символами. Есть даже однозначное соответствие между математическими теоремами и программами. Полезна для статического анализа кода, например проверять инварианты циклов.

Цитата Сообщение от Woldemar89 Посмотреть сообщение
Это че ваще? Я понял что лямбда, но она какая то рекурсивная.
И как 30 передается как параметр? Куда точнее?
ну у нас линейная функция, формула 5 класса y = ax+b, правда в данном случае скорее y = bx+a, но сути это не меняет. Вот её я и возвращаю. Посчитал коэффициенты уравнения и вернул его для произвольного X. А 30 уже сюда подставляется.

Добавлено через 16 секунд
Callback такой callback
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.08.2015, 18:02  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Ну тогда странно, что программированием решили заняться
Не странно, я могу кодить математику, но мне не нравится кодить математику

Цитата Сообщение от Psilon Посмотреть сообщение
вернул его для произвольного X
Цитата Сообщение от Psilon Посмотреть сообщение
А 30 уже сюда подставляется.
Куда сюда? Ткните носом пжлста путь аргумента 30, где он обрабатывается?

Цитата Сообщение от Psilon Посмотреть сообщение
Callback такой callback
От Ваших объяснений у меня крыша поехала еще больше, уровень явно не мой
Можете по колхозному объяснить, как работает код?
Вычисления, формулы, понятны, а вот лямбда, static Func<double, double> GetForecast
CallBack и приключения аргумента 30, - непонятны совсем.

Добавлено через 5 минут
Кажется я начинаю въезжать потихоньку...
Без бутылки не разберешься
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.08.2015, 18:49
Лучший ответ Сообщение было отмечено Woldemar89 как решение

Решение

Woldemar89, всё просто. Иногда функции ничего не возвращают. Иногда функции возвращают какие-то объекты, числа и т.п. А следующий уровень прозрения - функции, возвращающие другие функции. В данном случае мы возвращаем функцию, которая является уравнением прямой по этим точкам. Ну а затем эта функция где-то там вызывается.

На языке, который не поддерживает функции первого класса и замыкания пришлось писать в чисто ООП стиле:
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
    private static void Main()
    {
        double[] x = { 20, 28, 31, 38, 40 };
        double[] y = { 6, 7, 9, 15, 21 };
 
        var forecast = GetForecast(x, y);
 
        Console.WriteLine(forecast.Forecast(30));
    }
 
    private static FunctionHolder GetForecast(double[] x, double[] y)
    {
        if (x.Length != y.Length)
            throw new ArgumentException("x.Length != y.Length");
        var avgX = x.Average();
        var avgY = y.Average();
 
        double top = 0, bot = 0;
        for (int i = 0; i < x.Length; i++)
        {
            var dx = x[i] - avgX;
            top += dx*(y[i] - avgY);
            bot += dx*dx;
        }
 
        var b = top / bot;
        var a = avgY - b*avgX;
        return new FunctionHolder(a, b);
    }
 
    class FunctionHolder
    {
        private readonly double _a;
        private readonly double _b;
 
        public FunctionHolder(double a, double b)
        {
            _a = a;
            _b = b;
        }
 
        public double Forecast(double x)
        {
            return _a + _b*x;
        }
    }
Если бы у нас была поддержка функций первого порядка, но не было замыканий, пришлось бы писать класс, но не надо было бы его наружу показывать, и код стал бы таким:
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
    private static void Main()
    {
        double[] x = { 20, 28, 31, 38, 40 };
        double[] y = { 6, 7, 9, 15, 21 };
 
        var forecast = GetForecast(x, y);
 
        Console.WriteLine(forecast(30));
    }
 
    private static Func<double, double> GetForecast(double[] x, double[] y)
    {
        if (x.Length != y.Length)
            throw new ArgumentException("x.Length != y.Length");
        var avgX = x.Average();
        var avgY = y.Average();
 
        double top = 0, bot = 0;
        for (int i = 0; i < x.Length; i++)
        {
            var dx = x[i] - avgX;
            top += dx*(y[i] - avgY);
            bot += dx*dx;
        }
 
        var b = top / bot;
        var a = avgY - b*avgX;
        return new FunctionHolder(a, b).Forecast;
    }
Ну и в конце концов у нас если есть и замыкания, то мы просто оставляем генерацию этого класса компилятору, пусть за нас пишет рутинные классы, ничего сверхъестественного от него не требуется тут, и получается самый первый вариант.
2
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.08.2015, 18:57  [ТС]
Феерические познания просто Спасибо большое
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.08.2015, 18:57
Помогаю со студенческими работами здесь

функция ПРЕДСКАЗ
Всем привет, подскажите пожалуйста! Я не силен в мат анализе, но у меня возникла задача спрогнозировать объем продаж. Функция excel...

Задача по прогнозированию. ЛИНЕЙН и ПРЕДСКАЗ
Добрый вечер! Имеется задача, приложение ниже, нужно ее решить формулами, не макросами. Причем все данные из этой задачи должны быть...

Реализация функции "поиск решения" как в Excel
Подскажите как можно реализовать функцию &quot;поиск решения&quot; как в excel на с#.

Реализация функции вычисления электронно-цифровой подписи RSA. Реализация функции проверки ЭЦП RSA
Последовательность выполняемых действий включает следующие шаги. 1. Сформировать два простых числа p и q длиной 2 десятичных знака. 2....

Реализация программы в excel
Необходимо создать цикл Repeat until в excel, прикрепленный к определенным ячейкам, через макрос. Помогите написать программный код.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru