Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 136

Парсинг математического выражения запоминания результата

27.05.2015, 19:01. Показов 1600. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!!!
Пишу метод ньютона. Нужно вводить математическое выражение, парсить его и запоминать результат парсинга потому что одинаковую формулу нужно с другими значения аргумента считать много раз. Как мне это лучше сделать? Подскажите, пожалуйста, какую то библиотеку, или готовый код.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2015, 19:01
Ответы с готовыми решениями:

Есть ли готовое решение по отрисовке формулы Latex на базе математического выражения?
суть допустим есть некое матвыражение записаное по правилам ЯП.(пусть это будет С#), например sqrt((2*x^2-3)/(y-1)^3), как его...

Парсинг математического выражения
К примеру есть такая входная строка: z - min(z123, 456) + (k2) / sqrt(x) * (SomeFunc("Sunshine 34",f_var) + 45 - t) Суть в том,...

Строка: Парсинг арифметического выражения и вывод на экран результата
На входе: строка вида 18 + 5 (сумма или разность целых чисел). На выходе: результат выражения. public class Lab2 { public static...

7
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
27.05.2015, 20:02
Neptyn, Парсинг и вычисление выражения
1
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 136
28.05.2015, 17:36  [ТС]
Storm23, Большое Вам спасибо !!!
Очень хороший пример !!!
Но есть проблемы. Мне нужно метод Ньютона для ВНУ.
Есть наработки, только ошибка появляется при
C#
1
func[i] = x => calculator.Calculate(x)[i];//error!!!!!!!
полный код
Кликните здесь для просмотра всего текста
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
 
namespace Lab7
{
    public delegate double[] FM_d(double[] X);
 
    public partial class Form1 : Form
    {
        static Func<double, double>[] func;
 
        public Form1()
        {
            InitializeComponent();
            F_Grid.RowCount = X_Grid.RowCount = 3;
            F_Grid.ColumnCount = 1;
            X_Grid.Rows[0].Cells[0].Value = 0.75;
            X_Grid.Rows[1].Cells[0].Value = 1.5;
            X_Grid.Rows[2].Cells[0].Value = 4;
        }
 
        public static double[] FM(double[] X)
        {
            double[] Y = new double[X.Length];
            /*Y[0] = X[0] + Math.Exp(X[0] - 1) + (X[1] + X[2]) * (X[1] + X[2]) - 27;
            Y[1] = X[0] + Math.Exp(X[1] - 2) + X[2] * X[2] - 10;
            Y[2] = X[2] + Math.Sin(X[1] - 2) + X[1] * X[1] - 7;*/
            for (int i = 0; i < X.Length; i++)
            {
                Y[i] = func[i](X[i]);
            }
            return Y;
 
        }
 
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            F_Grid.RowCount = X_Grid.RowCount = trackBar1.Value;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            trackBar1.Enabled = false;
            func = new Func<double, double>[trackBar1.Value];
            var calculator = new ExpressionCalculator(trackBar1.Value);
            string[] expression = new string[trackBar1.Value];
            for (int i = 0; i < trackBar1.Value; i++)
            {
                var parts = Convert.ToString(X_Grid.Rows[i].Cells[0].Value).Split('=');
                expression[i] = string.Format("({0}) - ({1})", parts[0], parts[1]);
            }
            calculator.Compile(expression);
            for (int i = 0; i < trackBar1.Value; i++)
            {
                func[i] = x => calculator.Calculate(x)[i];//error!!!!!!!
            }
 
            Newton newton = new Newton(FM, 0.1, 200, trackBar1.Value);
            double[] X_initial = new double[trackBar1.Value];
            for (int i = 0; i < trackBar1.Value; i++)
            {
                X_initial[i] = Convert.ToDouble(X_Grid.Rows[i].Cells[0].Value);
            }
            bool Error = false;
            int k = 1;
            double[] X = newton.Newton_iteration(X_initial, ref Error, ref k);
            MessageBox.Show("Кількість ітерацій: " + k.ToString());
            if (Error)
            {
                MessageBox.Show("Error!!!");
            }
            for (int i = 0; i < trackBar1.Value; i++)
            {
                X_Grid.Rows[i].Cells[0].Value = Convert.ToString(X[i]);
            }
            trackBar1.Enabled = true;
        }
 
        public class ExpressionCalculator
        {
            private MethodInfo[] mi;
            int n;
 
            public ExpressionCalculator(int _n)
            {
                n = _n;
            }
 
            public double[] Calculate(double[] x)
            {
                double[] ret = new double[n];
                for (int i = 0; i < n; i++)
                {
                    ret[i] = (double)mi[i].Invoke(null, new object[] { x });
                }
                return ret;
            }
 
            public void Compile(string[] expression)
            {
                mi = new MethodInfo[n];
                var compilerParams = new CompilerParameters { GenerateInMemory = true };
                string[] source = new string[n];
                for (int i = 0; i < n; i++)
                {
                    source[i] =
                    @"using System;
 
                    public static class Calculator
                    {
                        public static double Calc(double[] X)
                        {
                            return %expression%;
                        }
                    }
                    ".Replace("%expression%", expression[i]);
 
                    // Компиляция
                    var results = new CSharpCodeProvider().CompileAssemblyFromSource(compilerParams, source);
                    //обработка ошибок
                    if (results.Errors.Count > 0)
                        throw new Exception(results.Errors[0].ErrorText);
                    //вычисляем
                    var calculator = results.CompiledAssembly.GetType("Calculator");
                    mi[i] = calculator.GetMethod("Calc");
 
                }
 
 
 
            }
 
        }        
    }
}


Какие варианты?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
28.05.2015, 19:41
Neptyn,
Во-первых, если выпадает ошибка, то нужно ВСЕГДА писать полный текст ошибки. А лучше и с содержимым стека тоже.
Во-вторых, зачем вы компилируете каждое уравнение отдельно? Его же можно скомпилить одним куском, что бы
public static double Calc(double[] X) возвращал массив double[].

Что касается ошибки:
У вас лямбда неправильно написана, должно быть так:

C#
1
2
3
4
5
            for (int i = 0; i < trackBar1.Value; i++)
            {
                var ii = i;
                func[i] = x => calculator.Calculate(x)[ii];
            }
Ну и код очень неоптимальный...
1
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 136
28.05.2015, 19:50  [ТС]
Storm23, Не работает...
Ошибки:
Кликните здесь для просмотра всего текста
Error 1 The best overloaded method match for 'Lab7.Form1.ExpressionCalculator.Calcula te(double[])' has some invalid arguments Visual Studio 2012\Projects\Lab7\Lab7\Form1.cs 66
Error 2 Argument 1: cannot convert from 'double' to 'double[]' Visual Studio 2012\Projects\Lab7\Lab7\Form1.cs 66


Цитата Сообщение от Storm23 Посмотреть сообщение
Ну и код очень неоптимальный...
Например?
Цитата Сообщение от Storm23 Посмотреть сообщение
Во-вторых, зачем вы компилируете каждое уравнение отдельно? Его же можно скомпилить одним куском, что бы
public static double Calc(double[] X) возвращал массив double[].
Так не получится, потому что не известно количество уравнений.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
28.05.2015, 19:58
Neptyn, У вас func должно принимать не одно значение x, а массив:
C#
1
2
3
static Func<double, double>[] func;
=>
static Func<double[], double>[] func;
Ну и в остальных местах нужно исправлять.
1
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 136
28.05.2015, 20:01  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Ну и в остальных местах нужно исправлять.
Не могли бы вы мне в этом помочь?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
29.05.2015, 09:15
Лучший ответ Сообщение было отмечено Neptyn как решение

Решение

Neptyn,
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
 
namespace Lab7
{
    public delegate double[] FM_d(double[] X);
 
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            F_Grid.RowCount = X_Grid.RowCount = 3;
            X_Grid.Rows[0].Cells[0].Value = 0.75;
            X_Grid.Rows[1].Cells[0].Value = 1.5;
            X_Grid.Rows[2].Cells[0].Value = 4;
 
            F_Grid.Rows[0].Cells[0].Value = "X[0] + exp(X[0] - 1) + (X[1] + X[2]) * (X[1] + X[2]) = 27";
            F_Grid.Rows[1].Cells[0].Value = "X[0] + exp(X[1] - 2) + X[2] * X[2] = 10";
            F_Grid.Rows[2].Cells[0].Value = "X[2] + sin(X[1] - 2) + X[1] * X[1] = 7";
        }
 
        public static double[] FM(double[] X)
        {
            double[] Y = new double[X.Length];
            /*Y[0] = X[0] + Math.Exp(X[0] - 1) + (X[1] + X[2]) * (X[1] + X[2]) - 27;
            Y[1] = X[0] + Math.Exp(X[1] - 2) + X[2] * X[2] - 10;
            Y[2] = X[2] + Math.Sin(X[1] - 2) + X[1] * X[1] - 7;
             * */
            for (int i = 0; i < X.Length; i++)
            {
                Y[i] = calculator.Calculate(X, i);
            }
 
            return Y;
        }
 
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            F_Grid.RowCount = X_Grid.RowCount = trackBar1.Value;
        }
 
        static ExpressionCalculator calculator;
 
        private void button1_Click(object sender, EventArgs e)
        {
            trackBar1.Enabled = false;
            //create calculator
            calculator = new ExpressionCalculator(trackBar1.Value);
            string[] expression = new string[trackBar1.Value]; 
            for (int i = 0; i < trackBar1.Value; i++)
            {
                var parts = Convert.ToString(F_Grid.Rows[i].Cells[0].Value).Split('=');
                expression[i] = string.Format("({0}) - ({1})", parts[0], parts[1]);
            }
            calculator.Compile(expression);
 
            //create newton solver
            Newton newton = new Newton(FM, 0.1, 200, trackBar1.Value);
 
            //init start X
            double[] X_initial = new double[trackBar1.Value];
            for (int i = 0; i < trackBar1.Value; i++)
            {
                X_initial[i] = Convert.ToDouble(X_Grid.Rows[i].Cells[0].Value);
            }
 
            //calculate
            bool Error = false;
            int k = 1;
            double[] X = newton.Newton_iteration(X_initial, ref Error, ref k);
            MessageBox.Show("Кількість ітерацій: " + k.ToString());
            if (Error)
            {
                MessageBox.Show("Error!!!");
            }
 
            //output
            for (int i = 0; i < trackBar1.Value; i++)
            {
                X_Grid.Rows[i].Cells[0].Value = X[i].ToString();
            }
            //
            trackBar1.Enabled = true;
        }
 
        public class ExpressionCalculator
        {
            private MethodInfo[] mi;
            int n;
 
            public ExpressionCalculator(int _n)
            {
                n = _n;
            }
 
            public double Calculate(double[] X, int i)
            {
                return (double)mi[i].Invoke(null, new object[]{X});
            }
 
            public void Compile(string[] expression)
            {
                mi = new MethodInfo[n];
                var compilerParams = new CompilerParameters { GenerateInMemory = true };
 
                for (int i = 0; i < n; i++)
                {
                    var source =
                    @"using System;
 
                    public static class Calculator"+i+@"
                    {
                        public static double Calc(double[] X)
                        {
                            return %expression%;
                        }
                        public static double sin(double x)
                        {
                            return Math.Sin(x);
                        }
 
                        public static double cos(double x)
                        {
                            return Math.Cos(x);
                        }
 
                        public static double exp(double x)
                        {
                            return Math.Exp(x);
                        }
                    }
                    ".Replace("%expression%", expression[i]);
 
                    // Компиляция
                    var results = new CSharpCodeProvider().CompileAssemblyFromSource(compilerParams, source);
                    //обработка ошибок
                    if (results.Errors.Count > 0)
                        throw new Exception(results.Errors[0].ErrorText);
                    //вычисляем
                    var calculator = results.CompiledAssembly.GetType("Calculator" + i);
                    mi[i] = calculator.GetMethod("Calc");
                }
            }
        }
    }
}
Lab7.zip
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2015, 09:15
Помогаю со студенческими работами здесь

О влиянии модели на точность результата математического моделирования
Вопрос следующий: есть ли теорема или другое научное обоснование, доказывающее, что результат моделирования будет наиболее точным, если...

Разбор математического выражения
Доброго времени суток, уважаемые форумчане. Хотелось бы услышать совет опытных людей по следующему вопросу: имеется некое математическое...

Вычисление математического выражения
Помогите реализовать математическое выражение на языке программирования PHP.

Решение математического выражения
Ребят, приближается сессия и нужна помощь :) дело в том, что не могу сообразить как выполнить умножение числа, на предыдущий результат,...

Запись математического выражения
Здравствуйте господа у меня вопрос. Как записать математическое выражение в С++ Но в не в консольном приложении . а в программе с...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru