在现代软件中,数学建模应用扮演着重要的角色。这些应用使用极其复杂的数学,并需要以图表、方案、3D模型、公式等形式展示结果。结果的展示必须简单易懂。因此,开发具有适当图形用户界面(GUI)的数学和工程应用是一项重要任务。WPF技术是解决这一任务的合适GUI开发框架之一。有许多免费和商业组件可用于以美观和适当的形式展示科学结果。
处理数学公式是科学应用可能要求之一。处理公式的常见场景有几种,最常用的是:评估公式值和以自然数学形式绘制公式。
将使用WPF Math项目来绘制数学公式。这个.NET库实现了渲染用TeX格式编写的数学表达式。TeX格式广泛用于创建科学文章和文档。绘制数学公式有一个简单的WPF组件“FormulaControl”,它有一个字符串属性“Formula”。将值分配给该属性,公式就会在组件上渲染。
例如,将值“\(\frac{(2n-1)!}{2^{n+1}} \sqrt{\frac{\pi}{a^{2n+1}}}\)”分配给该属性,会绘制如下数学公式:
\(\frac{(2n-1)!}{2^{n+1}} \sqrt{\frac{\pi}{a^{2n+1}}}\)
另一个例子是下一个TeX表达式“\(A \cdot \sin(n \cdot x) + \frac{B}{2} \cdot e^{m \cdot y}\)”,它产生了如下的数学形式:
\(A \cdot \sin(n \cdot x) + \frac{B}{2} \cdot e^{m \cdot y}\)
从上述例子中可以看出,所有公式都是以自然数学形式绘制的,易于阅读和理解。这种绘制公式的方式的一个小缺点是需要知道TeX表达式格式。该格式类似于脚本语言,使用特殊命令和词汇来定义数学符号,如分数、平方根、求和、乘积、积分、导数等。该格式的优点是所有公式都可以作为纯文本编写,而无需使用任何“非键盘”符号和特殊编辑器。
将使用Analytics项目()来评估数学表达式。ANALYTICS框架是一个通用的符号库。该库的主要功能是评估符号(分析)数学表达式。例如,处理数学表达式的简单代码如下:
C# Translator t = new Translator();
t.Add("A", 0.5);
t.Add("x", 12.4);
string f = "A*ln(Pi*x)";
double y1 = (double)t.Calculate(f);
t.Variables["x"].Value = 27.3;
double y2 = (double)t.Calculate(f);
在上面的代码中,Translator是ANALYTICS框架的主要类之一,实现了大部分符号功能。代码向Translator实例添加了两个变量:“A”和“x”。然后它使用当前变量值评估符号表达式,更改“x”变量的值,然后再次评估相同的表达式。
从上述例子中可以看出,Analytics库提供了一个简单的接口来评估数学表达式。表达式作为简单的C#字符串编写,可以包含字面值(常数)、变量、数学运算符、函数。该框架支持所有代数运算符(加法、乘法、幂等)、比较运算符(等于、不等于、小于、大于等)和逻辑运算符(非、与、或)。一些特殊数学运算符也得到支持,如求和(∑)、乘积(∏)、平方根(√)等。这些特殊运算符在表达式中以Unicode符号的形式编写,其表示法接近等效的数学公式。使用这些特殊符号的一个缺点是它们必须由特殊编辑器提供。
因此,有一个.NET库用于评估数学表达式,一个WPF组件用于以自然数学公式绘制数学表达式。想构建一个简单的“公式计算器”,它会评估数学表达式并将其结果作为数学公式显示。
剩下的唯一问题是评估库Analytics使用其自己的格式编写的表达式,而绘制库WPF Math需要公式以TeX格式。幸运的是,Analytics库包含特殊类将内部公式转换为TeX格式。以下是此类转换的示例代码:
C# string f = "A*sin(n*x)+B/2*e^(m*y)";
AnalyticsConverter converter = new AnalyticsTeXConverter();
string texf = "";
try {
texf = converter.Convert(f);
}
catch (Exception ex) {
// Show exception message...
}
// Using string in TeX format...
在上面的代码中,创建了AnalyticsTeXConverter类的实例。此类具有Convert方法,用于将符号表达式转换为TeX格式。对于表达式,结果字符串在TeX格式如下:
{{A}\cdot{{sin}\left({{n}\cdot{x}}\right)}}+{{\frac{B}{2}}\cdot{{e}^{{m}\cdot{y}}}}
现在有了实现简单“公式计算器”的所有成分。公式评估和绘制的主要功能可以通过以下方法实现:
C# string f = inputTextBox.Text;
try {
if (translator.CheckSyntax(f)) {
object v = translator.Calculate(f);
string texf = converter.Convert(f);
string vs = Utilities.SafeToString(v);
formulaControl.Formula = texf +
" = {" +
vs +
"}";
}
}
catch (Exception ex) {
formulaControl.Formula = ex.Message;
}
下面展示了一个简单的WPF应用程序,用于公式评估和绘制:
这个应用程序允许输入以Analytics格式编写的数学表达式,评估其值,并将其结果作为数学公式绘制。还有一些其他可以评估和绘制的公式示例。
分数的乘法“(x-2)/2*(x+1)/A/B*(x-A)*(x+B/2)”:
参数(对数)函数“A*log{3}(x+m)-B/log{2}(x+n)”:
复杂公式“A*x^2/(m-1)!+B*e^sin(y+1)/n!+C*log{n+m}(z^2)”:
从上述例子中可以看出,所有公式都是以自然数学格式绘制的。所呈现的方法可以用于各种工程和数学应用中,其中评估表达式的结果必须以适当和可读的形式显示。
这里应该指出的是,早期版本的计算机代数系统(CAS)使用了相同的方法。例如,Maple系统使用了“控制台”输入,其中表达式必须作为纯文本编写,但评估结果以数学公式的形式呈现。现在CAS系统使用交互式编辑器以自然形式编写所有数学公式。实现这样的交互式编辑器可能是这里使用的库的下一步发展。