gunshi-project-ss/src/main/java/com/gunshi/project/hsz/model/RegressionEquation.java

133 lines
3.9 KiB
Java
Raw Normal View History

package com.gunshi.project.hsz.model;
import lombok.Data;
import java.math.BigDecimal;
2025-11-18 16:26:32 +08:00
import java.math.RoundingMode;
import java.util.List;
/**
* 线
*/
@Data
public class RegressionEquation {
/**
*
*/
private int order;
/**
*
* y = ax² + bx + ccoefficients = [c, b, a]
*/
private List<BigDecimal> coefficients;
/**
* R²
*/
private BigDecimal rSquared;
/**
*
*/
private int dataCount;
/**
*
*/
private String equationString;
public RegressionEquation(int order, List<BigDecimal> coefficients, BigDecimal rSquared, int dataCount) {
this.order = order;
this.coefficients = coefficients;
this.rSquared = rSquared;
this.dataCount = dataCount;
this.equationString = generateEquationString();
}
/**
2025-11-18 16:26:32 +08:00
* 使
*/
private String generateEquationString() {
StringBuilder sb = new StringBuilder("y = ");
for (int i = coefficients.size() - 1; i >= 0; i--) {
BigDecimal coeff = coefficients.get(i);
if (coeff.compareTo(BigDecimal.ZERO) == 0) {
continue;
}
// 符号处理
if (sb.length() > 4 && coeff.compareTo(BigDecimal.ZERO) > 0) {
sb.append(" + ");
} else if (sb.length() > 4 && coeff.compareTo(BigDecimal.ZERO) < 0) {
sb.append(" - ");
coeff = coeff.abs();
}
2025-11-18 16:26:32 +08:00
// 系数和变量 - 保留至少20位小数
if (i == 0) {
2025-11-18 16:26:32 +08:00
// 常数项 - 保留至少20位小数
sb.append(coeff.setScale(20, RoundingMode.HALF_UP).toPlainString());
} else {
2025-11-18 16:26:32 +08:00
// 非常数项 - 保留至少20位小数
if (coeff.compareTo(BigDecimal.ONE) != 0 && coeff.compareTo(BigDecimal.ONE.negate()) != 0) {
2025-11-18 16:26:32 +08:00
sb.append(coeff.setScale(20, RoundingMode.HALF_UP).toPlainString());
}
sb.append("x");
if (i > 1) {
2025-11-18 16:26:32 +08:00
// 使用Unicode上标数字
sb.append(getSuperscript(i));
}
}
}
return sb.toString();
}
2025-11-18 16:26:32 +08:00
/**
* Unicode
*/
private String getSuperscript(int number) {
String numStr = String.valueOf(number);
StringBuilder superscript = new StringBuilder();
for (char c : numStr.toCharArray()) {
switch (c) {
case '0': superscript.append('⁰'); break;
case '1': superscript.append('¹'); break;
case '2': superscript.append('²'); break;
case '3': superscript.append('³'); break;
case '4': superscript.append('⁴'); break;
case '5': superscript.append('⁵'); break;
case '6': superscript.append('⁶'); break;
case '7': superscript.append('⁷'); break;
case '8': superscript.append('⁸'); break;
case '9': superscript.append('⁹'); break;
default: superscript.append(c);
}
}
return superscript.toString();
}
/**
* xy
*/
public BigDecimal predict(BigDecimal x) {
BigDecimal result = BigDecimal.ZERO;
BigDecimal xPower = BigDecimal.ONE;
for (int i = 0; i < coefficients.size(); i++) {
result = result.add(coefficients.get(i).multiply(xPower));
xPower = xPower.multiply(x);
}
return result;
}
@Override
public String toString() {
return String.format("%s", equationString);
}
}