跳转至

mXparser代数运算

mXparser代数运算

更新日期:2020-04-02


1. 概要

mXparser是一个能让我们进行代数计算的库。虽然我们通常编写程序的时候几乎没有可能用到,但感觉还是挺有趣的。

例如,我们可以给出未知数的值,来求解表达式的值:

1
2
3
4
设未知数x,y。
x = 12
y = 80
则(x + y) * 10 -100 = 820

这个库还支持高等数学符号以及函数定义等更为复杂的用法。这里我们来列一下mXparser支持的各种特性:

No. 特性 例子
1 简单的表达式求值 (2 + 4) * 10
2 逻辑运算 (1=20) 
3 使用内置函数 sin(2) + if(2<3, 1, 0) - min(10, 80)
4 自定义函数 f(n) = n + 1
5 数列求和 sum(i, 1, 100, i * 2),表示从2加到200,步长为2
6 求导数 der(sin(x), x, 1)
7 提供内置常数 如pi
8 自定义常数 比如定义 W = 80
9 定义递归函数 f(n) = f(n-1) + f(n-2)
10 质数相关操作 ispr(6),测试6是否是质数
11 语法检查
12 打印计算过程
13 产生随机数 rUni(1,2),产生1到2之间的小数随机数
14 概率分布期望值计算
15 带计量单位的值运算 ( 95*[cm] + 200*[m] + 1*[km] ) / [km]
16 求解方程
17 按位运算

很多特性都比较复杂,可以在需要的时候再去学习其用法。现在先从最基础的用法开始。

2. 查看内部帮助手册

mXparser有一个可以用程序打印出来的帮助手册。可以指定关键字来检索各种符号的用法。

1
mXparser.consolePrintHelp("要检索的内容");    

例如,我们需要计算三角函数cos,就可以检索cos关键字,输出结果为:

cos

可以看到有这么多关于cos的数学函数可以使用。

不指定关键字则会打印出所有的帮助内容。

3. 基础表示式符号

虽然我们习惯了数学书上的各种符号,但是在程序中我们一般使用不同的符号。

No. 符号 含义 用法
1 + 加号 1 + 1
2 - 减号/负号 10 - 9或者-100
3 * 乘号 2 * 5
4 / 除号 100 / 4
5 ^ 幂运算 2^16
6 ( ) 括号 (2 + 4) * 10
7 E/e 科学计数法 2E-3或者2e-3
8 % 百分号 50%
9 pi 圆周率符号 pi即为3.1415926… …

4. 计算表达式的值

以C#代码为例:

1
2
3
4
string exprStr = "(1 + 4) * 2 - 100";   
Expression expr = new Expression(exprStr);  
double rst = expr.calculate();  
Console.WriteLine(exprStr + " = " + rst);   

输出为:

1
(1 + 4) * 2 - 100 = -90

5. 设未知数

同样使用下面这个例子:

1
2
3
4
设未知数x,y。
x = 12
y = 80
则(x + y) * 10 -100 = 820
1
2
3
4
5
6
Argument x = new Argument("x = 12");    
Argument y = new Argument("y = 80");    
string exprStr = "(x + y) * 10 -100";   
Expression expr = new Expression(exprStr, x, y);    
double rst = expr.calculate();  
Console.WriteLine(exprStr + " = " + rst);   

输出为820

6. 定义函数

1
2
3
4
5
6
7
Argument x = new Argument("x = 12");    
Argument y = new Argument("y = 80");    
Function f = new Function("f(n) = 2 * n");  
string exprStr = "f(x) + f(y)"; 
Expression expr = new Expression(exprStr, x, y, f); 
double rst = expr.calculate();  
Console.WriteLine(exprStr + " = " + rst);   

7. 使用自定义函数

有时候,想定义的函数过于复杂,不好用一个表达式简单的定义出来。此时可以在代码中定义函数并注册到mxParse中。

定义一个自定义函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
    class MyFunc : FunctionExtension    
    {   
        public double X { get; set; }   
        public double Y { get; set; }   

        public MyFunc() 
        {   
            X = Double.NaN; 
            Y = Double.NaN; 
        }   

        public MyFunc(double x, double y)   
        {   
            X = x;  
            Y = y;  
        }   

        public double calculate()   
        {   
            return X * Y;   
        }   

        public FunctionExtension clone()    
        {   
            return new MyFunc(X, Y);    
        }   

        public string getParameterName(int parameterIndex)  
        {   
            switch (parameterIndex) 
            {   
                case 0: 
                    return "x"; 
                case 1: 
                    return "y"; 
                default:    
                    break;  
            }   

            return "n"; 
        }   

        public int getParametersNumber()    
        {   
            return 2;   
        }   

        public void setParameterValue(int parameterIndex, double parameterValue)    
        {   
            switch (parameterIndex) 
            {   
                case 0: 
                    X = parameterValue; 
                    break;  
                case 1: 
                    Y = parameterValue; 
                    break;  
                default:    
                    break;  
            }   
        }   

在程序中使用自定义函数:

1
2
3
4
5
6
7
Argument x = new Argument("x = 12");    
Argument y = new Argument("y = 80");    
Function f = new Function("f", new MyFunc());   
string exprStr = "f(x, y)"; 
Expression expr = new Expression(exprStr, x, y, f); 
double rst = expr.calculate();  
Console.WriteLine(exprStr + " = " + rst);