我正在尝试编写微分方程求解器,我需要允许用户通过文本框输入它们。问题是,当方程只包含x或类似x + y的东西时,求解方法会发生变化。如果在http://www.codeproject.com/KB/recipes/matheval.aspx上有很好的代码,但我无法将其扩展为2种方法
using System;
using System.Collections;
using System.Reflection;
namespace RKF45{
public class MathExpressionParser
{
public object myobj = null;
public ArrayList errorMessages;
public MathExpressionParser()
{
errorMessages = new ArrayList();
}
public bool init(string expr)
{
Microsoft.CSharp.CSharpCodeProvider cp = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.CompilerParameters cpar = new System.CodeDom.Compiler.CompilerParameters();
cpar.GenerateInMemory = true;
cpar.GenerateExecutable = false;
string src;
cpar.ReferencedAssemblies.Add("system.dll");
src = "using System;" +
"class myclass " +
"{ " +
"public myclass(){} " +
"public static double eval(double x) " +
"{ " +
"return " + expr + "; " +
"} " +
"public static double eval2(double x,double y) " +
"{ " +
"return " + expr + "; " +
"} " +
"} ";
System.CodeDom.Compiler.CompilerResults cr = cp.CompileAssemblyFromSource(cpar, src);
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
errorMessages.Add(ce.ErrorText);
if (cr.Errors.Count == 0 && cr.CompiledAssembly != null)
{
Type ObjType = cr.CompiledAssembly.GetType("myclass");
try
{
if (ObjType != null)
{
myobj = Activator.CreateInstance(ObjType);
}
}
catch (Exception ex)
{
errorMessages.Add(ex.Message);
}
return true;
}
else
return false;
}
public double eval(double x)
{
double val = 0.0;
Object[] myParams = new Object[1] { x };
if (myobj != null)
{
System.Reflection.MethodInfo evalMethod = myobj.GetType().GetMethod("eval");
val = (double)evalMethod.Invoke(myobj, myParams);
}
return val;
}
public double eval2(double x, double y)
{
double val = 0.0;
Object[] myParams = new Object[2] { x, y };
if (myobj != null)
{
System.Reflection.MethodInfo evalMethod = myobj.GetType().GetMethod("eval2");
val = (double)evalMethod.Invoke(myobj, myParams);
}
return val;
}
}
}
当我给出像x + y这样的表达式时,为什么eval2方法不能正常工作的任何想法? eval工作正常,但我需要其中2个来解决在文本框中输入的不同方程式。
答案 0 :(得分:1)
你不能在eval(double x)
和eval(double x, double y)
方法中使用包含两个不同变量(如“x”和“y”)的表达式:第一个不会编译(从第二个开始)变量没有在那里定义),而在这两种情况下使用仅包含单个变量(如“x”)的表达式。这解释了为什么在两个变量的情况下不能调用eval2()
的原因。