How to use fsolve to solve all the equations?

14 visualizzazioni (ultimi 30 giorni)
fayu
fayu il 18 Nov 2024
Commentato: Matt J il 18 Nov 2024
%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'))

Risposta accettata

Naga
Naga il 18 Nov 2024
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));

Più risposte (1)

Matt J
Matt J il 18 Nov 2024
given too many results
Perhaps you should use uniquetol, rather than unique.
  2 Commenti
fayu
fayu il 18 Nov 2024
Thank you for your suggestion, but using uniquetol command still can not solve
Matt J
Matt J il 18 Nov 2024
We don't know what that means. You haven't shown your attempt to use uniquetol() and the outcome.

Accedi per commentare.

Community Treasure Hunt

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

Start Hunting!

Translated by