二元高次方程
EquationSolver20250509.java
package math;import org.apache.commons.math3.analysis.MultivariateFunction;
import org.apache.commons.math3.optim.InitialGuess;
import org.apache.commons.math3.optim.MaxEval;
import org.apache.commons.math3.optim.PointValuePair;
import org.apache.commons.math3.optim.nonlinear.scalar.GoalType;
import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer;// 二元高次方程
// author zengwenfeng
// date 2025.05.09
public class EquationSolver20250509
{// 定義目標函數:f(a,y) = [(a + 2y - 1)^3 - a*y^3 - 1]^2static class EquationFunction implements MultivariateFunction{@Overridepublic double value(double[] point){double a = point[0];double y = point[1];double expr = Math.pow(a + 2 * y - 1, 3) - a * Math.pow(y, 3) - 1;return expr * expr; // 最小化平方誤差}}public static void main(String[] args){// 創建優化器SimplexOptimizer optimizer = new SimplexOptimizer(1e-10, 1e-12);// 定義目標函數MultivariateFunction function = new EquationFunction();// 設置優化參數int maxEvaluations = 10000;// 嘗試不同的初始猜測點來尋找多個解double[][] initialGuesses ={{1.0, 1.0}, // 初始猜測點1{0.5, 0.5}, // 初始猜測點2{2.0, -1.0}, // 初始猜測點3{5.0, 2.0}, // 初始猜測點4{0.0, 0.0} // 初始猜測點5};System.out.println("尋找方程 (a + 2y - 1)^3 - a*y^3 = 1 的解:");for (int i = 0; i < initialGuesses.length; i++){double[] guess = initialGuesses[i];try{// 執行優化PointValuePair result = optimizer.optimize(new MaxEval(maxEvaluations), new ObjectiveFunction(function), GoalType.MINIMIZE, new InitialGuess(guess), new NelderMeadSimplex(2) // 二維問題);double[] solution = result.getPoint();double a = solution[0];double y = solution[1];double error = result.getValue();// 只輸出誤差足夠小的解if (error < 1e-8){System.out.printf("解 %d: a = %.8f, y = %.8f, 誤差 = %.10f%n", i + 1, a, y, error);// 驗證解的正確性double expr = Math.pow(a + 2 * y - 1, 3) - a * Math.pow(y, 3);System.out.printf("驗證: (a + 2y - 1)^3 = %.8f, 1 + a*y^3 = %.8f%n", Math.pow(a + 2 * y - 1, 3), 1 + a * Math.pow(y, 3));}else{System.out.printf("初始猜測點 [%f, %f] 未能找到有效解,誤差 = %.10f%n", guess[0], guess[1], error);}}catch (Exception e){System.out.printf("初始猜測點 [%f, %f] 求解過程中出錯: %s%n", guess[0], guess[1], e.getMessage());}}}
}