.NET 4.x Парсинг и вычисление выражения - C#
Формулировка задачи:
Пожалуйста помогите понять, как написать код в компоненте на С# для решения уравнений c одной переменной Методом Ньютона. Не пойму как сделать так, чтобы можно было любую функцию с одной переменной с клавиатуры вводить, и чтобы программа её считывала и находила первую и вторую производные.
Буду очень благодарна за помощь.
Решение задачи: «.NET 4.x Парсинг и вычисление выражения»
textual
Листинг программы
using System; using System.CodeDom.Compiler; using System.Reflection; using System.Windows.Forms; using Microsoft.CSharp; namespace WindowsFormsApplication280 { public partial class Form1 : Form { private TextBox tbFunc; private TextBox tbX; private TextBox tbResult; public Form1() { InitializeComponent(); tbFunc = new TextBox {Parent = this, Top = 20, Text = "x*x = 1 - x"}; new Label { Parent = this, Top = 5, Text = "Function" }; tbX = new TextBox {Parent = this, Top = 60, Text = "1"}; new Label { Parent = this, Top = 45, Text = "First approximation" }; tbResult = new TextBox { Parent = this, Top = 100, ReadOnly = true }; new Label { Parent = this, Top = 85, Text = "Result" }; new Button { Parent = this, Top = 20, Left = 150, Text = "Calc" }.Click += bt_Click; } void bt_Click(object sender, EventArgs e) { var calculator = new ExpressionCalculator(); var parts = tbFunc.Text.Split('='); var expression = string.Format("({0}) - ({1})", parts[0], parts[1]); calculator.Compile(expression); var solver = new NewtonSolver(); var res = solver.Solve(x => calculator.Calculate(x), double.Parse(tbX.Text)); tbResult.Text = res.ToString("N5"); } } public class ExpressionCalculator { private MethodInfo mi; public void Compile(string expression) { string source = @" using System; public static class Calculator { public static double Calc(double x) { return %expression%; } }".Replace("%expression%", expression); // Настройки компиляции var compilerParams = new CompilerParameters { GenerateInMemory = true }; // Компиляция 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 = calculator.GetMethod("Calc"); } public double Calculate(double x) { return (double)mi.Invoke(null, new object[] { x }); } } public class NewtonSolver { public double Epsylon = 0.0001d; public double Solve(Func<double, double> func, double firstApprox) { var prev = firstApprox - Epsylon*2; var x = firstApprox; while(Math.Abs(x - prev) > Epsylon) { prev = x; //производная var dx = 0.001d; var y = func(x); var dy = func(x + dx) - y; var deriv = dy/dx; //формула Ньютона x = x - y/deriv; } return x; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д