How to use fsolve to solve all the equations?

40 visualizaciones (últimos 30 días)
fayu
fayu el 18 de Nov. de 2024 a las 3:00
Comentada: Matt J el 18 de Nov. de 2024 a las 14:53
%For the following equations want to solve all of its solutions, using solve to solve the time is too long, but using fsolve to solve I wrote the following program, but feel that the solution is not quite right, given too many results
function [F] = modulation_equation(X)
a=X(1);
c=X(2);
F(1)= 0.1096622461e0 * a ^ 6 - 0.4223705634e-1 * a ^ 8 + 0.4066962405e-2 * a ^ 10 - 0.1613995833e-2 * c ^ 2 * a ^ 4 + 0.5938649525e-5 * c ^ 4 * a ^ 2 - 0.3163847188e7 * c ^ 2 * a ^ 8 + 0.8689234851e5 * c ^ 4 * a ^ 6 + 0.9705023202e3 * c ^ 6 * a ^ 4 - 0.8469105945e0 * c ^ 2 * a ^ 6 + 0.1203014830e-1 * c ^ 4 * a ^ 4 - 0.4506937871e-4 * c ^ 6 * a ^ 2 + 0.8083313632e1 * c ^ 8 * a ^ 2;
F(2)= -0.6970477491e12 * a ^ 12 + 0.1914345842e11 * c ^ 2 * a ^ 10 + 0.2138367102e9 * c ^ 4 * a ^ 8 + 0.1815447799e7 * c ^ 6 * a ^ 6 - 0.5120907418e3 * c ^ 8 * a ^ 4 + 0.1885489314e1 * a ^ 2 * c ^ 10 - 0.8368566306e4 * c ^ 2 * a ^ 8 - 0.4108305749e5 * c ^ 4 * a ^ 6 + 0.6065237395e3 * c ^ 6 * a ^ 4 + 0.1220234699e5 * c ^ 2 * a ^ 6 - 0.1795926849e3 * c ^ 4 * a ^ 4 + 0.6608059271e0 * c ^ 6 * a ^ 2 - 0.2232435902e1 * c ^ 8 * a ^ 2;
end
clear
x_range = -1:0.01:1; % 定义 a 的初值范围
y_range = -1:0.05:1; % 定义 c 的初值范围
sol = []; % 用于存储唯一解的矩阵
options = optimoptions('fsolve', 'Display', 'off'); % 设置 fsolve 参数,不显示输出
% 遍历区间中的初值组合
for j = x_range
for i = y_range
x0 = [j, i]; % 当前初始点
try
% 尝试使用 fsolve 求解
[X_sol, fval, exitflag] = fsolve(@modulation_equation, x0, options);
if exitflag > 0 % 仅当成功求解时处理
% 检查新解是否已存在于 sol 中(判断相似解)
if isempty(sol) || all(vecnorm(sol - X_sol, 2, 2) > 1e-2)
sol = [sol; X_sol]; % 添加唯一解 (a, c) 作为一行
end
end
catch
% 如果 fsolve 失败,跳过该点
continue
end
end
end
sol = unique(sol, 'rows', 'stable');
sol1= sol(sol(:, 1) ~= 0 & sol(:, 2) ~= 0, :);
sol2=sqrt(sol1(:, 1).^2 + sol1(:, 2).^2);
sol3=sort(unique(sol2,'rows', 'stable'))
  1 comentario
Alex Sha
Alex Sha el 18 de Nov. de 2024 a las 9:36
some thing wrong? the exact solution is: a=0, c=0

Iniciar sesión para comentar.

Respuesta aceptada

Naga
Naga el 18 de Nov. de 2024 a las 3:21
To improve fsolve results, adjust the initial guess range (x_range and y_range) and step size to focus on promising regions. Modify tolerance settings using optimoptions to filter closely spaced solutions. After obtaining solutions, refine them with an appropriate distance threshold, adjusting from 1e-2 as needed for distinctness. Please go through the updated code for your reference:
function [F] = modulation_equation(X)
a = X(1);
c = X(2);
F(1) = 0.1096622461 * a^6 - 0.04223705634 * a^8 + 0.004066962405 * a^10 ...
- 0.001613995833 * c^2 * a^4 + 0.00005938649525 * c^4 * a^2 ...
- 31638471.88 * c^2 * a^8 + 868923.4851 * c^4 * a^6 ...
+ 970.5023202 * c^6 * a^4 - 0.8469105945 * c^2 * a^6 ...
+ 0.0120301483 * c^4 * a^4 - 0.00004506937871 * c^6 * a^2 ...
+ 80.83313632 * c^8 * a^2;
F(2) = -0.6970477491e12 * a^12 + 0.1914345842e11 * c^2 * a^10 ...
+ 0.2138367102e9 * c^4 * a^8 + 0.1815447799e7 * c^6 * a^6 ...
- 5120.907418 * c^8 * a^4 + 1.885489314 * a^2 * c^10 ...
- 83685.66306 * c^2 * a^8 - 410830.5749 * c^4 * a^6 ...
+ 6065.237395 * c^6 * a^4 + 122023.4699 * c^2 * a^6 ...
- 1795.926849 * c^4 * a^4 + 0.6608059271 * c^6 * a^2 ...
- 2.232435902 * c^8 * a^2;
end
clear
x_range = -1:0.05:1; % Adjusted step size for a
y_range = -1:0.1:1; % Adjusted step size for c
sol = []; % To store unique solutions
options = optimoptions('fsolve', 'Display', 'off', 'TolFun', 1e-6, 'TolX', 1e-6);
% Iterate over initial guesses
for j = x_range
for i = y_range
x0 = [j, i];
try
[X_sol, ~, exitflag] = fsolve(@modulation_equation, x0, options);
if exitflag > 0
if isempty(sol) || all(vecnorm(sol - X_sol, 2, 2) > 1e-2)
sol = [sol; X_sol];
end
end
catch
continue
end
end
end
% Ensure unique solutions
sol = unique(sol, 'rows', 'stable');
sol1 = sol(sol(:, 1) ~= 0 & sol(:, 2) ~= 0, :);
sol2 = sqrt(sol1(:, 1).^2 + sol1(:, 2).^2);
sol3 = sort(unique(sol2));

Más respuestas (1)

Matt J
Matt J el 18 de Nov. de 2024 a las 3:17
given too many results
Perhaps you should use uniquetol, rather than unique.
  2 comentarios
fayu
fayu el 18 de Nov. de 2024 a las 3:26
Thank you for your suggestion, but using uniquetol command still can not solve
Matt J
Matt J el 18 de Nov. de 2024 a las 14:53
We don't know what that means. You haven't shown your attempt to use uniquetol() and the outcome.

Iniciar sesión para comentar.

Categorías

Más información sobre Solver Outputs and Iterative Display en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by