Нераспознанная функция или переменная ‘x’ в MATLAB при решении системы нелинейных уравнений

Вопрос или проблема

Нераспознанная функция или переменная ‘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

код matlab (2023b)

Я даже определил x перед функцией как число, но все равно получаю ту же ошибку. Это не имеет смысла для меня. Как мне решать для x1, x2, x3, что и является основной целью?

Ответ или решение

Возникла ошибка "Unrecognized function or variable ‘x’" в вашем коде MATLAB из-за проблемы с использованием переменной x внутри самой функции system_of_eqs, когда вы вызываете fsolve. Важно отметить, что fsolve ожидает, чтобы пользователь передал в качестве аргумента функцию, которая принимает один аргумент, представляющий переменные, которые вы являетесь решением (в данном случае переменные x1, x2, x3).

В вашем коде, когда вы пытаетесь вызвать fsolve, он не может найти переменную x, так как она не была должным образом передана в аргументы функции.

Вот как вы можете исправить код для корректного решения системы нелинейных уравнений:

  1. Убедитесь, что переменная x передается на этапе вызова fsolve правильно.
  2. Уберите вызов 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’".

Оцените материал
Добавить комментарий

Капча загружается...