2014-02-06 33 views
1

我正在为学校项目建立科学计算器,并且必须在[a,b]中使用x,y实现函数的二次方程式等式 所以我使用Accord.Net和已成功地使用它,但我想这个过程自动化..BrentSearch从字符串输入找到根,最小值和最大值

我有这样的代码:

Func<double, double> function = x => x * x * x + 2 * x * x - 10 * x; 
     Accord.Math.Optimization.BrentSearch search = new Accord.Math.Optimization.BrentSearch(function, -4, 3); 
     double max = search.Maximize(); 
     double min = search.Minimize(); 
     double root = search.FindRoot(); 

但我需要做这样的事情:

string temp = Input.Text.ToString(); 
     Func<double, double> function = x => temp; //doesn't want string, and BrentSearch wants func<double,double> 
     Accord.Math.Optimization.BrentSearch search = new Accord.Math.Optimization.BrentSearch(function, -4, 3); 
     double max = search.Maximize(); 
     double min = search.Minimize(); 
     double root = search.FindRoot(); 

问题是,Func键不接受字符串和BrentSearch希望FUNC

而且输入来自文本框,用户manualy输入功能..

谢谢!!!!!!!

回答

2

这不是一个简单的任务。你实际上正试图将用户输入转换成C#代码 - 这与C#编译器本质上是一样的!

如果您想尝试一下,可以利用C#编译器为您进行解析。

using System; 
using System.CodeDom.Compiler; 
using System.Collections.Generic; 
using System.Text; 
using Microsoft.CSharp; 

private static Func<double, double> CompileFunction(string expression) 
{ 
    StringBuilder sourceBuilder = new StringBuilder(); 
    sourceBuilder.AppendLine("using System;"); 
    sourceBuilder.AppendLine("using System.Linq.Expressions;"); 
    sourceBuilder.AppendLine("class ExpressionGenerator{"); 
    sourceBuilder.AppendLine("public static Func<double, double> Generate(){"); 
    sourceBuilder.AppendLine("return x => " + expression + ";"); 
    sourceBuilder.AppendLine("}}"); 


    Dictionary<string, string> providerOptions = new Dictionary<string, string>(); 
    providerOptions.Add("CompilerVersion", "v3.5"); 
    CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions); 
    CompilerParameters parameters = new CompilerParameters(new[] { "System.Core.dll" }); 
    CompilerResults results = provider.CompileAssemblyFromSource(parameters, sourceBuilder.ToString()); 
    return (Func<double, double>)results.CompiledAssembly.GetType("ExpressionGenerator").GetMethod("Generate").Invoke(null, null); 
} 

你可以调用这个函数是这样的:

string input = "x * x"; // Or however you get the input 
Func<double, double> myFunction = CompileFunction(input); 

你仍然需要处理像琴弦提供语法错误的事情,等

+1

是的这个作品。最后我把我的功能放在字符串中,并且现在用你的帮助正确地获得根源!谢谢! – user2497254

相关问题