✨ Support multi variables
This commit is contained in:
		
							
								
								
									
										197
									
								
								lib/solver.dart
									
									
									
									
									
								
							
							
						
						
									
										197
									
								
								lib/solver.dart
									
									
									
									
									
								
							@@ -37,8 +37,8 @@ class SolverService {
 | 
				
			|||||||
      for (int m = -100; m <= 100; m++) {
 | 
					      for (int m = -100; m <= 100; m++) {
 | 
				
			||||||
        for (int n = -100; n <= 100; n++) {
 | 
					        for (int n = -100; n <= 100; n++) {
 | 
				
			||||||
          if (m + n == -bb && m * n == cc) {
 | 
					          if (m + n == -bb && m * n == cc) {
 | 
				
			||||||
            String factor1 = _formatFactorTerm(1, -m);
 | 
					            String factor1 = _formatFactorTerm(1, -m, 'x');
 | 
				
			||||||
            String factor2 = _formatFactorTerm(1, -n);
 | 
					            String factor2 = _formatFactorTerm(1, -n, 'x');
 | 
				
			||||||
            return '($factor1)($factor2)';
 | 
					            return '($factor1)($factor2)';
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -65,15 +65,15 @@ class SolverService {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// 格式化因式中的项
 | 
					  /// 格式化因式中的项
 | 
				
			||||||
  String _formatFactorTerm(int coeff, int constTerm) {
 | 
					  String _formatFactorTerm(int coeff, int constTerm, [String variable = 'x']) {
 | 
				
			||||||
    String result = '';
 | 
					    String result = '';
 | 
				
			||||||
    if (coeff != 0) {
 | 
					    if (coeff != 0) {
 | 
				
			||||||
      if (coeff == 1)
 | 
					      if (coeff == 1)
 | 
				
			||||||
        result += 'x';
 | 
					        result += variable;
 | 
				
			||||||
      else if (coeff == -1)
 | 
					      else if (coeff == -1)
 | 
				
			||||||
        result += '-x';
 | 
					        result += '-$variable';
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        result += '${coeff}x';
 | 
					        result += '${coeff}$variable';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (constTerm != 0) {
 | 
					    if (constTerm != 0) {
 | 
				
			||||||
      if (result.isNotEmpty) {
 | 
					      if (result.isNotEmpty) {
 | 
				
			||||||
@@ -89,15 +89,36 @@ class SolverService {
 | 
				
			|||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// 检测方程中的变量
 | 
				
			||||||
 | 
					  Set<String> _detectVariables(String input) {
 | 
				
			||||||
 | 
					    final variablePattern = RegExp(r'\b([a-zA-Z])\b');
 | 
				
			||||||
 | 
					    final matches = variablePattern.allMatches(input);
 | 
				
			||||||
 | 
					    return matches.map((match) => match.group(1)!).toSet();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// 主入口方法,识别并分发任务
 | 
					  /// 主入口方法,识别并分发任务
 | 
				
			||||||
  CalculationResult solve(String input) {
 | 
					  CalculationResult solve(String input) {
 | 
				
			||||||
    // 预处理输入字符串
 | 
					    // 预处理输入字符串
 | 
				
			||||||
    final cleanInput = input.replaceAll(' ', '').toLowerCase();
 | 
					    final cleanInput = input.replaceAll(' ', '').toLowerCase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 对包含x的方程进行预处理,展开表达式
 | 
					    // 检测方程中的变量
 | 
				
			||||||
 | 
					    final variables = _detectVariables(cleanInput);
 | 
				
			||||||
 | 
					    if (variables.isEmpty) {
 | 
				
			||||||
 | 
					      // 如果没有变量,当作简单表达式处理
 | 
				
			||||||
 | 
					      try {
 | 
				
			||||||
 | 
					        return _solveSimpleExpression(input);
 | 
				
			||||||
 | 
					      } catch (e) {
 | 
				
			||||||
 | 
					        throw Exception('无法识别的格式。请检查您的方程或表达式。');
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 获取主变量(第一个检测到的变量)
 | 
				
			||||||
 | 
					    final mainVariable = variables.first;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 对包含变量的方程进行预处理,展开表达式
 | 
				
			||||||
    String processedInput = cleanInput;
 | 
					    String processedInput = cleanInput;
 | 
				
			||||||
    if (processedInput.contains('x') && processedInput.contains('(')) {
 | 
					    if (processedInput.contains(mainVariable) && processedInput.contains('(')) {
 | 
				
			||||||
      processedInput = _expandExpressions(processedInput);
 | 
					      processedInput = _expandExpressions(processedInput, mainVariable);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 0. 检查是否是 (expr)^n = constant 的形式(任意次幂)
 | 
					    // 0. 检查是否是 (expr)^n = constant 的形式(任意次幂)
 | 
				
			||||||
@@ -113,13 +134,19 @@ class SolverService {
 | 
				
			|||||||
      final rightValue = double.tryParse(rightStr);
 | 
					      final rightValue = double.tryParse(rightStr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (rightValue != null) {
 | 
					      if (rightValue != null) {
 | 
				
			||||||
        return _solveGeneralPowerEquation(exprStr, n, rightValue, cleanInput);
 | 
					        return _solveGeneralPowerEquation(
 | 
				
			||||||
 | 
					          exprStr,
 | 
				
			||||||
 | 
					          n,
 | 
				
			||||||
 | 
					          rightValue,
 | 
				
			||||||
 | 
					          cleanInput,
 | 
				
			||||||
 | 
					          mainVariable,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 0.5. 检查是否是 a(expr)^2 = b 的形式(向后兼容)
 | 
					    // 0.5. 检查是否是 a(expr)^2 = b 的形式(向后兼容)
 | 
				
			||||||
    final squareEqMatch = RegExp(
 | 
					    final squareEqMatch = RegExp(
 | 
				
			||||||
      r'^(\d*\.?\d*)\(([^)]+)\)\^2\s*=\s*(.+)$',
 | 
					      r'^(\d*\.?\d*)?\(([^)]+)\)\^2\s*=\s*(.+)$',
 | 
				
			||||||
    ).firstMatch(cleanInput);
 | 
					    ).firstMatch(cleanInput);
 | 
				
			||||||
    if (squareEqMatch != null) {
 | 
					    if (squareEqMatch != null) {
 | 
				
			||||||
      final coeffStr = squareEqMatch.group(1)!;
 | 
					      final coeffStr = squareEqMatch.group(1)!;
 | 
				
			||||||
@@ -132,14 +159,16 @@ class SolverService {
 | 
				
			|||||||
      // 解析右边
 | 
					      // 解析右边
 | 
				
			||||||
      double right = double.parse(rightStr);
 | 
					      double right = double.parse(rightStr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // 解析 expr 为 x ± h
 | 
					      // 解析 expr 为 variable ± h
 | 
				
			||||||
      final exprMatch = RegExp(r'x\s*([+-]\s*\d*\.?\d*)?').firstMatch(exprStr);
 | 
					      final exprMatch = RegExp(
 | 
				
			||||||
 | 
					        r'$mainVariable\s*([+-]\s*\d*\.?\d*)?',
 | 
				
			||||||
 | 
					      ).firstMatch(exprStr);
 | 
				
			||||||
      if (exprMatch != null) {
 | 
					      if (exprMatch != null) {
 | 
				
			||||||
        final hStr = exprMatch.group(1) ?? '';
 | 
					        final hStr = exprMatch.group(1) ?? '';
 | 
				
			||||||
        double constant = hStr.isEmpty
 | 
					        double constant = hStr.isEmpty
 | 
				
			||||||
            ? 0.0
 | 
					            ? 0.0
 | 
				
			||||||
            : double.parse(hStr.replaceAll(' ', ''));
 | 
					            : double.parse(hStr.replaceAll(' ', ''));
 | 
				
			||||||
        double h = -constant; // For (x - h)^2, h is the center
 | 
					        double h = -constant; // For (var - h)^2, h is the center
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 使用有理数计算
 | 
					        // 使用有理数计算
 | 
				
			||||||
        final coeffRat = _rationalFromDouble(coeff);
 | 
					        final coeffRat = _rationalFromDouble(coeff);
 | 
				
			||||||
@@ -173,44 +202,49 @@ class SolverService {
 | 
				
			|||||||
                title: '开方',
 | 
					                title: '开方',
 | 
				
			||||||
                explanation: '对方程两边同时开平方。',
 | 
					                explanation: '对方程两边同时开平方。',
 | 
				
			||||||
                formula:
 | 
					                formula:
 | 
				
			||||||
                    '\$\$x ${h >= 0 ? '+' : ''}$h = \\pm \\sqrt{\\frac{${innerRat.numerator}}{${innerRat.denominator}}}\$\$',
 | 
					                    '\$\$${mainVariable} ${h >= 0 ? '+' : ''}$h = \\pm \\sqrt{\\frac{${innerRat.numerator}}{${innerRat.denominator}}}\$\$',
 | 
				
			||||||
              ),
 | 
					              ),
 | 
				
			||||||
              CalculationStep(
 | 
					              CalculationStep(
 | 
				
			||||||
                stepNumber: 4,
 | 
					                stepNumber: 4,
 | 
				
			||||||
                title: '解出 x',
 | 
					                title: '解出 ${mainVariable}',
 | 
				
			||||||
                explanation: '分别取正负号,解出 x 的值。',
 | 
					                explanation: '分别取正负号,解出 ${mainVariable} 的值。',
 | 
				
			||||||
                formula: '\$\$x_1 = $x1Str, \\quad x_2 = $x2Str\$\$',
 | 
					                formula:
 | 
				
			||||||
 | 
					                    '\$\$${mainVariable}_1 = $x1Str, \\quad ${mainVariable}_2 = $x2Str\$\$',
 | 
				
			||||||
              ),
 | 
					              ),
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            finalAnswer: '\$\$x_1 = $x1Str, \\quad x_2 = $x2Str\$\$',
 | 
					            finalAnswer:
 | 
				
			||||||
 | 
					                '\$\$${mainVariable}_1 = $x1Str, \\quad ${mainVariable}_2 = $x2Str\$\$',
 | 
				
			||||||
          );
 | 
					          );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 1. 检查是否为二元一次方程组 (格式: ...;...)
 | 
					    // 1. 检查是否为多元一次方程组 (格式: ...;...)
 | 
				
			||||||
    if (processedInput.contains(';') &&
 | 
					    if (processedInput.contains(';') && variables.length > 1) {
 | 
				
			||||||
        processedInput.contains('x') &&
 | 
					      return _solveSystemOfLinearEquations(processedInput, variables);
 | 
				
			||||||
        processedInput.contains('y')) {
 | 
					 | 
				
			||||||
      return _solveSystemOfLinearEquations(processedInput);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 2. 检查是否为一元二次方程 (包含 x^2 或 x²)
 | 
					    // 2. 检查是否为一元二次方程 (包含 variable^2 或 variable²)
 | 
				
			||||||
    if (processedInput.contains('x^2') || processedInput.contains('x²')) {
 | 
					    if (processedInput.contains('${mainVariable}^2') ||
 | 
				
			||||||
      return _solveQuadraticEquation(processedInput.replaceAll('x²', 'x^2'));
 | 
					        processedInput.contains('${mainVariable}²')) {
 | 
				
			||||||
 | 
					      return _solveQuadraticEquation(
 | 
				
			||||||
 | 
					        processedInput.replaceAll('${mainVariable}²', '${mainVariable}^2'),
 | 
				
			||||||
 | 
					        mainVariable,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 3. 检查是否为幂次方程 (x^n = a 的形式)
 | 
					    // 3. 检查是否为幂次方程 (variable^n = a 的形式)
 | 
				
			||||||
    if (processedInput.contains('x^') && processedInput.contains('=')) {
 | 
					    if (processedInput.contains('${mainVariable}^') &&
 | 
				
			||||||
      return _solvePowerEquation(processedInput);
 | 
					        processedInput.contains('=')) {
 | 
				
			||||||
 | 
					      return _solvePowerEquation(processedInput, mainVariable);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 4. 检查是否为一元一次方程 (包含 x 但不包含 y 或 x^2)
 | 
					    // 4. 检查是否为一元一次方程 (包含主变量)
 | 
				
			||||||
    if (processedInput.contains('x') && !processedInput.contains('y')) {
 | 
					    if (processedInput.contains(mainVariable)) {
 | 
				
			||||||
      return _solveLinearEquation(processedInput);
 | 
					      return _solveLinearEquation(processedInput, mainVariable);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 4. 如果都不是,则作为简单表达式计算
 | 
					    // 如果都不是,则作为简单表达式计算
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      return _solveSimpleExpression(input); // 使用原始输入以保留运算符
 | 
					      return _solveSimpleExpression(input); // 使用原始输入以保留运算符
 | 
				
			||||||
    } catch (e) {
 | 
					    } catch (e) {
 | 
				
			||||||
@@ -287,7 +321,10 @@ class SolverService {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// 2. 求解一元一次方程
 | 
					  /// 2. 求解一元一次方程
 | 
				
			||||||
  CalculationResult _solveLinearEquation(String input) {
 | 
					  CalculationResult _solveLinearEquation(
 | 
				
			||||||
 | 
					    String input, [
 | 
				
			||||||
 | 
					    String variable = 'x',
 | 
				
			||||||
 | 
					  ]) {
 | 
				
			||||||
    final steps = <CalculationStep>[];
 | 
					    final steps = <CalculationStep>[];
 | 
				
			||||||
    // Parse the input to get LaTeX-formatted version
 | 
					    // Parse the input to get LaTeX-formatted version
 | 
				
			||||||
    final parser = Parser(input);
 | 
					    final parser = Parser(input);
 | 
				
			||||||
@@ -303,7 +340,7 @@ class SolverService {
 | 
				
			|||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    final parts = _parseLinearEquation(input);
 | 
					    final parts = _parseLinearEquation(input, variable);
 | 
				
			||||||
    final a = parts.a, b = parts.b, c = parts.c, d = parts.d;
 | 
					    final a = parts.a, b = parts.b, c = parts.c, d = parts.d;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    final newA = _rationalFromDouble(a) - _rationalFromDouble(c);
 | 
					    final newA = _rationalFromDouble(a) - _rationalFromDouble(c);
 | 
				
			||||||
@@ -313,9 +350,9 @@ class SolverService {
 | 
				
			|||||||
      CalculationStep(
 | 
					      CalculationStep(
 | 
				
			||||||
        stepNumber: 1,
 | 
					        stepNumber: 1,
 | 
				
			||||||
        title: '移项',
 | 
					        title: '移项',
 | 
				
			||||||
        explanation: '将所有含 x 的项移到等式左边,常数项移到右边。',
 | 
					        explanation: '将所有含 ${variable} 的项移到等式左边,常数项移到右边。',
 | 
				
			||||||
        formula:
 | 
					        formula:
 | 
				
			||||||
            '\$\$${a}x ${c >= 0 ? '-' : '+'} ${c.abs()}x = $d ${b >= 0 ? '-' : '+'} ${b.abs()}\$\$',
 | 
					            '\$\$${a}${variable} ${c >= 0 ? '-' : '+'} ${c.abs()}${variable} = $d ${b >= 0 ? '-' : '+'} ${b.abs()}\$\$',
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -325,7 +362,7 @@ class SolverService {
 | 
				
			|||||||
        title: '合并同类项',
 | 
					        title: '合并同类项',
 | 
				
			||||||
        explanation: '合并等式两边的项。',
 | 
					        explanation: '合并等式两边的项。',
 | 
				
			||||||
        formula:
 | 
					        formula:
 | 
				
			||||||
            '\$\$${_formatNumber(newA.toDouble())}x = ${_formatNumber(newD.toDouble())}\$\$',
 | 
					            '\$\$${_formatNumber(newA.toDouble())}${variable} = ${_formatNumber(newD.toDouble())}\$\$',
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -340,17 +377,23 @@ class SolverService {
 | 
				
			|||||||
    steps.add(
 | 
					    steps.add(
 | 
				
			||||||
      CalculationStep(
 | 
					      CalculationStep(
 | 
				
			||||||
        stepNumber: 3,
 | 
					        stepNumber: 3,
 | 
				
			||||||
        title: '求解 x',
 | 
					        title: '求解 ${variable}',
 | 
				
			||||||
        explanation: '两边同时除以 x 的系数 ($newA)。',
 | 
					        explanation: '两边同时除以 ${variable} 的系数 ($newA)。',
 | 
				
			||||||
        formula: '\$\$x = \\frac{$newD}{$newA}\$\$',
 | 
					        formula: '\$\$${variable} = \\frac{$newD}{$newA}\$\$',
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return CalculationResult(steps: steps, finalAnswer: '\$\$x = $x\$\$');
 | 
					    return CalculationResult(
 | 
				
			||||||
 | 
					      steps: steps,
 | 
				
			||||||
 | 
					      finalAnswer: '\$\$${variable} = $x\$\$',
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// 3. 求解一元二次方程 (升级版)
 | 
					  /// 3. 求解一元二次方程 (升级版)
 | 
				
			||||||
  CalculationResult _solveQuadraticEquation(String input) {
 | 
					  CalculationResult _solveQuadraticEquation(
 | 
				
			||||||
 | 
					    String input, [
 | 
				
			||||||
 | 
					    String variable = 'x',
 | 
				
			||||||
 | 
					  ]) {
 | 
				
			||||||
    final steps = <CalculationStep>[];
 | 
					    final steps = <CalculationStep>[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    final eqParts = input.split('=');
 | 
					    final eqParts = input.split('=');
 | 
				
			||||||
@@ -376,8 +419,8 @@ class SolverService {
 | 
				
			|||||||
    // );
 | 
					    // );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Also get numeric values for calculations
 | 
					    // Also get numeric values for calculations
 | 
				
			||||||
    final leftCoeffs = _parsePolynomial(eqParts[0]);
 | 
					    final leftCoeffs = _parsePolynomial(eqParts[0], variable);
 | 
				
			||||||
    final rightCoeffs = _parsePolynomial(eqParts[1]);
 | 
					    final rightCoeffs = _parsePolynomial(eqParts[1], variable);
 | 
				
			||||||
    final a = (leftCoeffs[2] ?? 0) - (rightCoeffs[2] ?? 0);
 | 
					    final a = (leftCoeffs[2] ?? 0) - (rightCoeffs[2] ?? 0);
 | 
				
			||||||
    final b = (leftCoeffs[1] ?? 0) - (rightCoeffs[1] ?? 0);
 | 
					    final b = (leftCoeffs[1] ?? 0) - (rightCoeffs[1] ?? 0);
 | 
				
			||||||
    final c = (leftCoeffs[0] ?? 0) - (rightCoeffs[0] ?? 0);
 | 
					    final c = (leftCoeffs[0] ?? 0) - (rightCoeffs[0] ?? 0);
 | 
				
			||||||
@@ -579,6 +622,7 @@ class SolverService {
 | 
				
			|||||||
    int n,
 | 
					    int n,
 | 
				
			||||||
    double rightValue,
 | 
					    double rightValue,
 | 
				
			||||||
    String originalInput,
 | 
					    String originalInput,
 | 
				
			||||||
 | 
					    String variable,
 | 
				
			||||||
  ) {
 | 
					  ) {
 | 
				
			||||||
    final steps = <CalculationStep>[];
 | 
					    final steps = <CalculationStep>[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -666,8 +710,8 @@ class SolverService {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// 3.6. 求解幂次方程 (x^n = a 的形式)
 | 
					  /// 3.6. 求解幂次方程 (variable^n = a 的形式)
 | 
				
			||||||
  CalculationResult _solvePowerEquation(String input) {
 | 
					  CalculationResult _solvePowerEquation(String input, [String variable = 'x']) {
 | 
				
			||||||
    final steps = <CalculationStep>[];
 | 
					    final steps = <CalculationStep>[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 解析方程
 | 
					    // 解析方程
 | 
				
			||||||
@@ -677,10 +721,12 @@ class SolverService {
 | 
				
			|||||||
    final leftSide = parts[0].trim();
 | 
					    final leftSide = parts[0].trim();
 | 
				
			||||||
    final rightSide = parts[1].trim();
 | 
					    final rightSide = parts[1].trim();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 检查左边是否为 x^n 的形式
 | 
					    // 检查左边是否为 variable^n 的形式
 | 
				
			||||||
    final powerMatch = RegExp(r'^x\^(\d+)$').firstMatch(leftSide);
 | 
					    final powerMatch = RegExp(
 | 
				
			||||||
 | 
					      r'^${RegExp.escape(variable)}\^(\d+)$',
 | 
				
			||||||
 | 
					    ).firstMatch(leftSide);
 | 
				
			||||||
    if (powerMatch == null) {
 | 
					    if (powerMatch == null) {
 | 
				
			||||||
      throw Exception("不支持的幂次方程格式。当前支持 x^n = a 的形式。");
 | 
					      throw Exception("不支持的幂次方程格式。当前支持 ${variable}^n = a 的形式。");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    final n = int.parse(powerMatch.group(1)!);
 | 
					    final n = int.parse(powerMatch.group(1)!);
 | 
				
			||||||
@@ -711,8 +757,8 @@ class SolverService {
 | 
				
			|||||||
      CalculationStep(
 | 
					      CalculationStep(
 | 
				
			||||||
        stepNumber: 2,
 | 
					        stepNumber: 2,
 | 
				
			||||||
        title: '对方程两边同时开 $n 次方',
 | 
					        title: '对方程两边同时开 $n 次方',
 | 
				
			||||||
        explanation: '对方程两边同时开 $n 次方以解出 x。',
 | 
					        explanation: '对方程两边同时开 $n 次方以解出 ${variable}。',
 | 
				
			||||||
        formula: '\$\$x = \\sqrt[$n]{$a}\$\$',
 | 
					        formula: '\$\$${variable} = \\sqrt[$n]{$a}\$\$',
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -740,18 +786,21 @@ class SolverService {
 | 
				
			|||||||
        stepNumber: 3,
 | 
					        stepNumber: 3,
 | 
				
			||||||
        title: '计算结果',
 | 
					        title: '计算结果',
 | 
				
			||||||
        explanation: '计算开 $n 次方的结果。',
 | 
					        explanation: '计算开 $n 次方的结果。',
 | 
				
			||||||
        formula: '\$\$x = $resultStr\$\$',
 | 
					        formula: '\$\$${variable} = $resultStr\$\$',
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return CalculationResult(
 | 
					    return CalculationResult(
 | 
				
			||||||
      steps: steps,
 | 
					      steps: steps,
 | 
				
			||||||
      finalAnswer: '\$\$x = $resultStr\$\$',
 | 
					      finalAnswer: '\$\$${variable} = $resultStr\$\$',
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// 4. 求解二元一次方程组
 | 
					  /// 4. 求解二元一次方程组
 | 
				
			||||||
  CalculationResult _solveSystemOfLinearEquations(String input) {
 | 
					  CalculationResult _solveSystemOfLinearEquations(
 | 
				
			||||||
 | 
					    String input, [
 | 
				
			||||||
 | 
					    Set<String> variables = const {'x', 'y'},
 | 
				
			||||||
 | 
					  ]) {
 | 
				
			||||||
    final steps = <CalculationStep>[];
 | 
					    final steps = <CalculationStep>[];
 | 
				
			||||||
    final equations = input.split(';');
 | 
					    final equations = input.split(';');
 | 
				
			||||||
    if (equations.length != 2) throw Exception("格式错误, 请用 ';' 分隔两个方程。");
 | 
					    if (equations.length != 2) throw Exception("格式错误, 请用 ';' 分隔两个方程。");
 | 
				
			||||||
@@ -998,7 +1047,7 @@ ${b1}y &= ${c1 - a1 * x.toDouble()}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /// ---- 辅助函数 ----
 | 
					  /// ---- 辅助函数 ----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  String _expandExpressions(String input) {
 | 
					  String _expandExpressions(String input, [String variable = 'x']) {
 | 
				
			||||||
    String result = input;
 | 
					    String result = input;
 | 
				
			||||||
    int maxIterations = 10; // Prevent infinite loops
 | 
					    int maxIterations = 10; // Prevent infinite loops
 | 
				
			||||||
    int iterationCount = 0;
 | 
					    int iterationCount = 0;
 | 
				
			||||||
@@ -1017,7 +1066,7 @@ ${b1}y &= ${c1 - a1 * x.toDouble()}
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        final factor = powerMatch.group(2)!;
 | 
					        final factor = powerMatch.group(2)!;
 | 
				
			||||||
        final coeffs = _parsePolynomial(factor);
 | 
					        final coeffs = _parsePolynomial(factor, variable);
 | 
				
			||||||
        final a = coeffs[1] ?? 0;
 | 
					        final a = coeffs[1] ?? 0;
 | 
				
			||||||
        final b = coeffs[0] ?? 0;
 | 
					        final b = coeffs[0] ?? 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1040,8 +1089,8 @@ ${b1}y &= ${c1 - a1 * x.toDouble()}
 | 
				
			|||||||
        final factor2 = factorMulMatch.group(2)!;
 | 
					        final factor2 = factorMulMatch.group(2)!;
 | 
				
			||||||
        log('Expanding: ($factor1) * ($factor2)');
 | 
					        log('Expanding: ($factor1) * ($factor2)');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        final coeffs1 = _parsePolynomial(factor1);
 | 
					        final coeffs1 = _parsePolynomial(factor1, variable);
 | 
				
			||||||
        final coeffs2 = _parsePolynomial(factor2);
 | 
					        final coeffs2 = _parsePolynomial(factor2, variable);
 | 
				
			||||||
        log('Coeffs1: $coeffs1, Coeffs2: $coeffs2');
 | 
					        log('Coeffs1: $coeffs1, Coeffs2: $coeffs2');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        final a = coeffs1[1] ?? 0;
 | 
					        final a = coeffs1[1] ?? 0;
 | 
				
			||||||
@@ -1078,8 +1127,8 @@ ${b1}y &= ${c1 - a1 * x.toDouble()}
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Parse the term (coefficient and x power)
 | 
					        // Parse the term (coefficient and x power)
 | 
				
			||||||
        final termCoeffs = _parsePolynomial(termStr);
 | 
					        final termCoeffs = _parsePolynomial(termStr, variable);
 | 
				
			||||||
        final factorCoeffs = _parsePolynomial(factorStr);
 | 
					        final factorCoeffs = _parsePolynomial(factorStr, variable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        final termA = termCoeffs[1] ?? 0; // x coefficient
 | 
					        final termA = termCoeffs[1] ?? 0; // x coefficient
 | 
				
			||||||
        final termB = termCoeffs[0] ?? 0; // constant term
 | 
					        final termB = termCoeffs[0] ?? 0; // constant term
 | 
				
			||||||
@@ -1122,8 +1171,8 @@ ${b1}y &= ${c1 - a1 * x.toDouble()}
 | 
				
			|||||||
        final rightSide = parts[1];
 | 
					        final rightSide = parts[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 解析左边的多项式
 | 
					        // 解析左边的多项式
 | 
				
			||||||
        final leftCoeffs = _parsePolynomial(leftSide);
 | 
					        final leftCoeffs = _parsePolynomial(leftSide, variable);
 | 
				
			||||||
        final rightCoeffs = _parsePolynomial(rightSide);
 | 
					        final rightCoeffs = _parsePolynomial(rightSide, variable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 计算标准形式 ax^2 + bx + c = 0 的系数
 | 
					        // 计算标准形式 ax^2 + bx + c = 0 的系数
 | 
				
			||||||
        // A = B 转换为 A - B = 0,所以右边的系数要取相反数
 | 
					        // A = B 转换为 A - B = 0,所以右边的系数要取相反数
 | 
				
			||||||
@@ -1165,12 +1214,15 @@ ${b1}y &= ${c1 - a1 * x.toDouble()}
 | 
				
			|||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  LinearEquationParts _parseLinearEquation(String input) {
 | 
					  LinearEquationParts _parseLinearEquation(
 | 
				
			||||||
 | 
					    String input, [
 | 
				
			||||||
 | 
					    String variable = 'x',
 | 
				
			||||||
 | 
					  ]) {
 | 
				
			||||||
    final parts = input.split('=');
 | 
					    final parts = input.split('=');
 | 
				
			||||||
    if (parts.length != 2) throw Exception("方程格式错误,应包含一个'='。");
 | 
					    if (parts.length != 2) throw Exception("方程格式错误,应包含一个'='。");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    final leftCoeffs = _parsePolynomial(parts[0]);
 | 
					    final leftCoeffs = _parsePolynomial(parts[0], variable);
 | 
				
			||||||
    final rightCoeffs = _parsePolynomial(parts[1]);
 | 
					    final rightCoeffs = _parsePolynomial(parts[1], variable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return LinearEquationParts(
 | 
					    return LinearEquationParts(
 | 
				
			||||||
      (leftCoeffs[1] ?? 0.0),
 | 
					      (leftCoeffs[1] ?? 0.0),
 | 
				
			||||||
@@ -1180,7 +1232,7 @@ ${b1}y &= ${c1 - a1 * x.toDouble()}
 | 
				
			|||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Map<int, double> _parsePolynomial(String side) {
 | 
					  Map<int, double> _parsePolynomial(String side, [String variable = 'x']) {
 | 
				
			||||||
    final coeffs = <int, double>{};
 | 
					    final coeffs = <int, double>{};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 如果输入包含括号,去掉括号
 | 
					    // 如果输入包含括号,去掉括号
 | 
				
			||||||
@@ -1189,9 +1241,12 @@ ${b1}y &= ${c1 - a1 * x.toDouble()}
 | 
				
			|||||||
      cleanSide = cleanSide.substring(1, cleanSide.length - 1);
 | 
					      cleanSide = cleanSide.substring(1, cleanSide.length - 1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 扩展模式以支持 sqrt 函数
 | 
					    // 扩展模式以支持 sqrt 函数,使用动态变量
 | 
				
			||||||
 | 
					    final escapedVar = RegExp.escape(variable);
 | 
				
			||||||
    final pattern = RegExp(
 | 
					    final pattern = RegExp(
 | 
				
			||||||
      r'([+-]?(?:\d*\.?\d*|sqrt\(\d+\)))x(?:\^(\d+))?|([+-]?(?:\d*\.?\d*|sqrt\(\d+\)))',
 | 
					      r'([+-]?(?:\d*\.?\d*|sqrt\(\d+\)))' +
 | 
				
			||||||
 | 
					          escapedVar +
 | 
				
			||||||
 | 
					          r'(?:\^(\d+))?|([+-]?(?:\d*\.?\d*|sqrt\(\d+\)))',
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    var s = cleanSide.startsWith('+') || cleanSide.startsWith('-')
 | 
					    var s = cleanSide.startsWith('+') || cleanSide.startsWith('-')
 | 
				
			||||||
        ? cleanSide
 | 
					        ? cleanSide
 | 
				
			||||||
@@ -1206,7 +1261,7 @@ ${b1}y &= ${c1 - a1 * x.toDouble()}
 | 
				
			|||||||
        final constValue = _parseCoefficientWithSqrt(constStr);
 | 
					        final constValue = _parseCoefficientWithSqrt(constStr);
 | 
				
			||||||
        coeffs[0] = (coeffs[0] ?? 0) + constValue;
 | 
					        coeffs[0] = (coeffs[0] ?? 0) + constValue;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        // x 的幂次项
 | 
					        // 变量的幂次项
 | 
				
			||||||
        int power = match.group(2) != null ? int.parse(match.group(2)!) : 1;
 | 
					        int power = match.group(2) != null ? int.parse(match.group(2)!) : 1;
 | 
				
			||||||
        String coeffStr = match.group(1) ?? '+';
 | 
					        String coeffStr = match.group(1) ?? '+';
 | 
				
			||||||
        final coeff = _parseCoefficientWithSqrt(coeffStr);
 | 
					        final coeff = _parseCoefficientWithSqrt(coeffStr);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user