在 WPF 应用程序中绘制和评估数学公式





5.00/5 (10投票s)
本文介绍了一种在 WPF 应用程序中实现数学公式评估和绘制的简单方法。
引言
工程和数学建模应用是现代软件的重要组成部分。这些应用涉及极其复杂的数学,并需要以图表、示意图、3D 模型、公式等形式呈现结果。结果的呈现必须易于理解和感知。因此,开发具有适当 GUI 的数学和工程应用是一项重要任务。WPF 技术是解决此任务的合适 GUI 开发框架之一。有许多免费和商业组件可以以美观且恰当的形式呈现科学结果。
处理数学公式是科学应用中可能的需求之一。处理公式有几种常见场景。最常用的是:评估公式值和以自然数学形式绘制公式。
本文介绍了一种在 WPF 应用程序中使用两个现有的 C# 库来实现数学公式评估和绘制的简单方法。第一个库用于以自然数学形式绘制公式。第二个库用于评估公式值。结合使用这两个库可以创建一个简单的“公式计算器”,该计算器可以评估 string
表达式并将结果显示为数学公式。
绘制数学公式
我们将使用 WPF Math 项目来绘制数学公式。这个 .NET 库可以渲染用 TeX 格式编写的数学表达式。TeX 格式广泛用于创建科学文章和文档。对于绘制数学公式,有一个简单的 WPF 组件‘FormulaControl
’,它有一个名为‘Formula
’的 string
属性。为该属性赋值后,公式就会在组件上渲染。
例如,将此值‘\frac{(2n-1)!}{2^{n+1}} \sqrt{\frac{\pi}{a^{2n+1}}}’赋给该属性会如下绘制数学公式:
另一个例子是以下 TeX 表达式‘{A}\cdot{sin\left({n\cdot x}\right)}+\frac{B}{2} \cdot {e^{m \cdot y}}’,它会生成如下的数学形式公式:
从上面的例子可以看出,所有公式都以易于阅读和理解的自然数学形式绘制。编写公式用于绘图的一个小缺点是需要了解 TeX 表达式格式。该格式类似于脚本语言,使用特殊的命令和词法单元来定义数学符号,如分数、平方根、求和、乘积、积分、微分等。该格式的优点是所有公式都可以作为纯文本编写,而无需使用任何“非键盘”符号和特殊编辑器。
评估数学表达式
我们将使用 Analytics 项目(http://sergey-l-gladkiy.narod.ru/index/analytics/0-13)来评估数学表达式。ANALYTICS 框架是一个通用的符号库。该库的主要功能是评估符号(解析)数学表达式。例如,有一个简单的代码用于处理数学表达式:
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# string
s 形式编写,并且可以包含文字值(常量)、变量、数学运算符、函数。该框架支持所有代数运算符(加法、乘法、幂运算等)、比较运算符(相等、不相等、小于、大于等)和逻辑运算符(非、与、或)。还支持一些特殊的数学运算符,如求和(∑)、乘积(∏)、平方根(√)等。这些特殊运算符在表达式中以 Unicode 符号编写,其表示法接近等效的数学公式。使用这些特殊符号的一个缺点是必须由特殊编辑器提供。
Analytics 框架中的表达式格式比 TeX 表达式更接近数学表达式。尽管如此,这仍然不是我们期望的自然数学公式书写格式。例如,Analytics 表达式中的幂运算必须写成“x^y”,而不是我们期望的等效数学公式 xy 。
实现简单的公式计算器
因此,我们有一个用于评估数学表达式的 .NET 库和一个用于将数学表达式绘制为自然数学公式的 WPF 组件。我们希望构建一个简单的“公式计算器”,它可以评估数学表达式并将结果显示为数学公式。
唯一剩下的问题是评估库 Analytics 使用其自身格式编写的表达式,而绘图库 WPF Math 需要 TeX 格式的公式。幸运的是,Analytics 库包含用于将内部公式转换为 TeX 格式的特殊类。以下是一个用于此类转换的代码示例:
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
类的实例。该类具有用于将符号表达式转换为 TeX 格式的 Convert
方法。对于该表达式,结果字符串的 TeX 格式如下:
{{{A}\cdot{{sin}\left({{n}\cdot{x}}\right)}}+{{\frac{B}{2}}\cdot{{e}^{{m}\cdot{y}}}}}
现在我们拥有实现我们简单的“公式计算器”的所有要素。公式评估和绘制的主要功能可以通过一个方法实现,如下所示:
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 系统使用交互式编辑器以自然形式书写所有数学公式。实现这样的交互式编辑器可能是我们所使用的库的下一步发展。
结论
本文介绍了一种在 WPF 应用程序中实现公式评估和绘制的方法。使用了两个库:一个用于数学表达式评估,一个用于公式绘制。该方法通过一个简单的 WPF 应用程序进行了演示,该应用程序允许将数学表达式作为纯文本输入,然后评估表达式的值并将结果绘制为数学公式。同样的方法也可用于其他数学和工程应用,其中数学公式的评估结果应以恰当且易读的形式呈现。
历史
- 2019 年 3 月 10 日:初稿