Skip to content

Commit

Permalink
...
Browse files Browse the repository at this point in the history
  • Loading branch information
liamkuan committed Apr 10, 2019
1 parent 40d9774 commit ac99a94
Show file tree
Hide file tree
Showing 7 changed files with 195 additions and 387 deletions.
136 changes: 40 additions & 96 deletions lib/src/command/handleEquations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,68 +11,46 @@ class EquationsUtil {
return instance;
}
///处理方程计算,判断是
String handleEquation(String equations, String xs){
String handleEquation(String equations){
String result;
if(equations.contains('^')){
result = _nonlinearEquation(equations, xs);
}else{
result = _handleLineEquations(equations, xs);
if(equations.contains(';')){
result = _handleLineEquations(equations);
}else {
result = _nonlinearEquation(equations);
}
return result;
}
///传入线性方程组和变量求得结果
///@param raweuations 线性方程组,以逗号隔开
///@param rawvars 所有变量,以逗号隔开
String _handleLineEquations(String raweuations, String rawvars) {
RegExp char = new RegExp(r'^[A-Za-z]+[0-9]*');
var varmap = new Map();
String _handleLineEquations(String euationsStr) {
String result = '';
var index = 0;
var equations = raweuations.split(',');
var vars = rawvars.split(',');
if (equations.length != vars.length) {
return '方程个数应与未知数个数相等';
}
for (int i = 0; i < vars.length; i++) {
postMatrix.add([]);
constant.add([]);
constant[i].add(0);
for (int j = 0; j < vars.length; j++) {
postMatrix[i].add(0);
}
}
for (var v in vars) {
if (!char.hasMatch(v)) {
return '变量必须以字母开头,数字只能放在结尾位置';
}
varmap[v] = index;
index++;
}
var equationIndex = 0;
for (var equation in equations) {
var reg = RegExp(r'=');
var matchs = reg.allMatches(equation);
if (matchs.length != 1) {
return '方程中等号数量错误';
}
if (equation.contains(RegExp(r'\*|/'))) {
return '线性方程组不处理乘除运算';
}
var lr = equation.split('=');
var leftEquation = lr[0];
var rightEquation = lr[1];
try{
_simplifiedEquation(leftEquation, varmap, true, equationIndex);
_simplifiedEquation(rightEquation, varmap, false, equationIndex);
}catch(e){
return e.toString();
var equations = euationsStr.split(';');
var length = equations[0].split(',').length;
var postMatrix = <List<num>>[];
var constant = <List<num>>[];
try{
for (int i = 0; i < equations.length; i++) {
postMatrix.add(<num>[]);
constant.add([]);
var ns = equations[i].split(',');
if(length != ns.length) return '第 ${i+1} 行参数数量与第一行不一致';
for (int j = 0; j < ns.length; j++) {
if (j != ns.length - 1){
postMatrix[i].add(num.parse(ns[j]));
}else {
constant[i].add(num.parse(ns[j]));
}
}
}
equationIndex++;
}catch (e){
return '系数阵输入有误';
}

var resultList = MatrixUtil.m2mRide(MatrixUtil.getAdjoint(postMatrix), constant);
var sb = new StringBuffer();
for(int i=0;i<vars.length;i++){
sb.write(vars[i] + ': ' + resultList[i][0].toStringAsFixed(SettingData.fixedNum.round()));
for(int i=0;i<resultList.length;i++){
sb.write('第 ${i + 1} 个解为: ' + resultList[i][0].toStringAsFixed(SettingData.fixedNum.round()));
sb.write('\n');
}
result = sb.toString();
Expand Down Expand Up @@ -131,58 +109,24 @@ class EquationsUtil {
///传入非线性方程,返回结果
///@param equation 非线性方程组
///@param x 变量
String _nonlinearEquation(String equation, String x){
equation = equation.replaceAll(' ', '') + ' ';
num c = 0;
var map = new Map();
if(equation.substring(0,1) != '-'){
equation = '+' + equation;
}
var reg = new RegExp(r'(\+|-)[0-9]*' + x + r'(\^[0-9]+)?');
var numReg = new RegExp(r'(\+|-)[0-9]+[^' + x + r']');
var mas = reg.allMatches(equation);
int maxPower = 0;
///获取每一项的系数和幂数
for(var m in mas){
var xi = m.group(0).indexOf(x);
String postStr = m.group(0).substring(0, xi);
if(postStr.length == 1){
postStr += '1';
}
var post = num.parse(postStr); //多项式系数
var power;
if(m.group(0).contains('^')) {
var poweri = m.group(0).indexOf('^');
power = num.parse(m.group(0).substring(poweri + 1)); //多项式幂数
if (power > maxPower) {
maxPower = power;
}
}else{
power = 1;
}
if (map.containsKey(power)) {
map[power] += post;
String _nonlinearEquation(String equation){
var nums = equation.split(',');
var list = <num>[];
for(var n in nums) {
var temp = num.tryParse(n);
if(temp != null) {
list.add(temp);
} else {
map[power] = post;
}
}
var numMs = numReg.allMatches(equation);
for(var m in numMs){
num temp = num.tryParse(m.group(0));
if(temp != null){
c += temp;
return "$n 不能被识别为数字";
}
}
var maxPower = list.length - 1;
List<List<num>> matrix = MatrixUtil.initMatrix(maxPower, maxPower);
///将多项式的最高次幂项系数化为1
matrix[0][maxPower - 1] = -(c / map[maxPower]);
matrix[0][maxPower - 1] = -(list[list.length - 1] / list[maxPower]);
for(int i=maxPower - 1;i>0;i--){
if(!map.containsKey(i)){
map[i] = 0;
}else{
map[i] = map[i] / map[maxPower];
}
matrix[0][maxPower - i - 1] = -map[i];
list[i] = list[i] / list[maxPower];
matrix[0][maxPower - i - 1] = -list[i];
}
for(int i=1;i<maxPower;i++){
for(int j=0;j<maxPower;j++){
Expand Down
142 changes: 0 additions & 142 deletions lib/src/command/handleNonlinearEquation.dart

This file was deleted.

20 changes: 16 additions & 4 deletions lib/src/language/xiaomingLocalizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@ class XiaomingLocalizations {
'empty': 'empty',
'equations' : 'Equations',
'equationNotEmpty' : 'Equations cannot be empty',
'equationTip' : 'Tip: this page can be used to solve linear equations and higher-order unary equations',
'equaHint1':
'A linear equation is one or more equations whose highest power is one',
'equaHint2': 'Example a00x + + a02z a01y = b0, a10x + + a12z a11y = b1,',
'equaHint3': 'a20x +a21y+a22z=b2 ',
'equaHint2': 'Example 3x-2y+z=2,3y+5z=8,',
'equaHint3': 'Multiple equation are separated by commas, Parameter is x,y,z',
'equaHint4':
'Polynomials refer to equations of one variable multiple times',
'equaHint5': "Example: x^2-2x+1",
Expand Down Expand Up @@ -63,6 +64,7 @@ class XiaomingLocalizations {
'parameter' : 'parameter',
'removeUF' : 'UserFuntion has been removed',
'removeData' : 'Data has been removed',
'sample' : 'Sample',
'Setting': 'Setting',
'save' : 'save',
'Saved function': 'Saved function',
Expand Down Expand Up @@ -90,9 +92,10 @@ class XiaomingLocalizations {
'empty': '清空',
'equations' : '方程',
'equationNotEmpty' : '方程组不能为空',
'equationTip' : '提示:本页面可求解线性方程组和一元高次方程',
'equaHint1': '线性方程指最高次幂为1次的一元或多元方程',
'equaHint2': '例a00x+a01y+a02z=b0,a10x+a11y+a12z=b1,',
'equaHint3': 'a20x+a21y+a22z=b2 变量栏输入x,y,z',
'equaHint2': '例: 3x-2y+z=2,3y+5z=8,',
'equaHint3': '多个方程用逗号分隔,变量栏输入x,y,z',
'equaHint4': '多项式指一元多次方程',
'equaHint5': "例:'x^2-2x+1' ,变量栏输入x",
'funName' : '函数名',
Expand Down Expand Up @@ -133,6 +136,7 @@ class XiaomingLocalizations {
'parameter' : '参数',
'removeUF' : '自定义方法被移除',
'removeData' : '数据被移除',
'sample' : '示例',
'Setting': '设置',
'save' : '保存',
'Saved function': '保存的函数',
Expand Down Expand Up @@ -205,6 +209,10 @@ class XiaomingLocalizations {
return _localizedValues[locale.languageCode]['equations'];
}

get equationTip {
return _localizedValues[locale.languageCode]['equationTip'];
}

get equaHint1 {
return _localizedValues[locale.languageCode]['equaHint1'];
}
Expand Down Expand Up @@ -333,6 +341,10 @@ class XiaomingLocalizations {
return _localizedValues[locale.languageCode]['removeData'];
}

get sample {
return _localizedValues[locale.languageCode]['sample'];
}

get savedFunction {
return _localizedValues[locale.languageCode]['Saved function'];
}
Expand Down
Loading

0 comments on commit ac99a94

Please sign in to comment.