Вопрос или проблема
Нераспознанная функция или переменная ‘x’ в MATLAB при решении системы нелинейных уравнений
При выполнении этого кода я постоянно получаю ошибку “Неопознанная функция или переменная ‘x'”.
function aby = system_of_eqs(x)
% a=alpha, b=beta, y=gamma
% Инициализация aby как вектора нулей
aby = zeros(3, 1);
% Первое уравнение
aby(1) = ( ((1/x(1)) + (1/x(2)) + (1/x(3))) + ((1/x(1)) +
(1/(2*x(2))) + (1/(4*x(3)))) + ...
((1/x(1)) + (1/(3*x(2))) + (1/(9*x(3)))) + ((1/x(1)) +
(1/(4*x(2))) + (1/(16*x(3)))) + ...
((1/x(1)) + (1/(5*x(2))) + (1/(25*x(3)))) + ((1/x(1)) +
(1/(6*x(2))) + (1/(36*x(3)))));
% Второе уравнение
aby(2) = ( ((1/x(1)) + (1/x(2)) + (1/x(3))) + ((1/x(1)) +
(1/(2*x(2))) + (1/(4*x(3)))) + ...
((1/x(1)) + (1/(3*x(2))) + (1/(9*x(3)))) + ((1/x(1)) +
(1/(4*x(2))) + (1/(16*x(3)))) + ...
((1/x(1)) + (1/(5*x(2))) + (1/(25*x(3)))) + ((1/x(1)) +
(1/(6*x(2))) + (1/(36*x(3)))));
% Третье уравнение
aby(3) = ( ((1/x(1)) + (1/x(2)) + (1/x(3))) + ((1/x(1)) +
(1/(2*x(2))) + (1/(4*x(3)))) + ...
((1/x(1)) + (1/(3*x(2))) + (1/(9*x(3)))) + ((1/x(1)) +
(1/(4*x(2))) + (1/(16*x(3)))) + ...
((1/x(1)) + (1/(5*x(2))) + (1/(25*x(3)))) + ((1/x(1)) +
(1/(6*x(2))) + (1/(36*x(3)))));
% Используйте ненулевую начальную догадку
x0 = [1, 4, 19]; % Ненулевая начальная догадка
% Решите систему уравнений, используя fsolve
solution = fsolve(@system_of_eqs, x0);
% Отобразите решение
display(solution)
end
Я даже определил x перед функцией как число, но все равно получаю ту же ошибку. Это не имеет смысла для меня. Как мне решать для x1, x2, x3, что и является основной целью?
Ответ или решение
Возникла ошибка "Unrecognized function or variable ‘x’" в вашем коде MATLAB из-за проблемы с использованием переменной x
внутри самой функции system_of_eqs
, когда вы вызываете fsolve
. Важно отметить, что fsolve
ожидает, чтобы пользователь передал в качестве аргумента функцию, которая принимает один аргумент, представляющий переменные, которые вы являетесь решением (в данном случае переменные x1
, x2
, x3
).
В вашем коде, когда вы пытаетесь вызвать fsolve
, он не может найти переменную x
, так как она не была должным образом передана в аргументы функции.
Вот как вы можете исправить код для корректного решения системы нелинейных уравнений:
- Убедитесь, что переменная
x
передается на этапе вызоваfsolve
правильно. - Уберите вызов
fsolve
из функции определения системы уравнений и выполните его снаружи.
Вот исправленный код:
function aby = system_of_eqs(x)
% a=alpha, b=beta, y=gamma
% Инициализация aby вектором нулей
aby = zeros(3, 1);
% Первое уравнение
aby(1) = ((1/x(1)) + (1/x(2)) + (1/x(3))) + ...
((1/x(1)) + (1/(2*x(2))) + (1/(4*x(3)))) + ...
((1/x(1)) + (1/(3*x(2))) + (1/(9*x(3)))) + ...
((1/x(1)) + (1/(4*x(2))) + (1/(16*x(3)))) + ...
((1/x(1)) + (1/(5*x(2))) + (1/(25*x(3)))) + ...
((1/x(1)) + (1/(6*x(2))) + (1/(36*x(3))));
% Второе уравнение (например, уравнение можно изменить)
aby(2) = ((1/x(1)) + (1/x(2)) + (1/x(3))) + ...
((1/x(1)) + (1/(2*x(2))) + (1/(4*x(3)))) + ...
((1/x(1)) + (1/(3*x(2))) + (1/(9*x(3)))) + ...
((1/x(1)) + (1/(4*x(2))) + (1/(16*x(3)))) + ...
((1/x(1)) + (1/(5*x(2))) + (1/(25*x(3)))) + ...
((1/x(1)) + (1/(6*x(2))) + (1/(36*x(3))));
% Третье уравнение (например, уравнение можно изменить)
aby(3) = ((1/x(1)) + (1/x(2)) + (1/x(3))) + ...
((1/x(1)) + (1/(2*x(2))) + (1/(4*x(3)))) + ...
((1/x(1)) + (1/(3*x(2))) + (1/(9*x(3)))) + ...
((1/x(1)) + (1/(4*x(2))) + (1/(16*x(3)))) + ...
((1/x(1)) + (1/(5*x(2))) + (1/(25*x(3)))) + ...
((1/x(1)) + (1/(6*x(2))) + (1/(36*x(3))));
end
% Внешний скрипт для вызова fsolve
x0 = [1, 4, 19]; % Начальное приближение
options = optimoptions('fsolve', 'Display', 'iter'); % Опции для fsolve
solution = fsolve(@system_of_eqs, x0, options); % Решение системы
% Отображение решения
disp('Решение системы уравнений:');
disp(solution);
Основные изменения:
- Убрали вызов
fsolve
из функцииsystem_of_eqs
. Вместо этого мы вызываемfsolve
в отдельном скрипте или функции. - Убедились, что передаем корректное начальное приближение и параметры в
fsolve
. - Следует убедиться, что характеристики функций, передаваемых в
fsolve
, соответствуют ожидаемым.
Сохраните оба участка кода в одном файле, и теперь вы должны избежать ошибки "Unrecognized function or variable ‘x’".