(x ^ 2 + 2y − 1) ^ 3 − x ^ 2 * y ^ 3 = 1

发布于:2025-05-10 ⋅ 阅读:(16) ⋅ 点赞:(0)

二元高次方程

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]^2
	static class EquationFunction implements MultivariateFunction
	{
		@Override
		public 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());
			}
		}
	}
}


网站公告

今日签到

点亮在社区的每一天
去签到