2014-02-06 35 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

相關問題