Решение уравнений в массиве ячеек - PullRequest
1 голос
/ 14 января 2012

У меня есть несколько линейных уравнений в массиве ячеек, подобных этому (количество уравнений меняется каждый раз):

equs = { '2*X1+X2+6', '3*X2-X1' }

Как я могу решить это уравнение с Matlab? Я могу получить свой ответ просто с помощью этой функции:

ans = solve(equs(1), equs(2));

Но так как число уравнений различается каждый раз, я хочу, чтобы это было сделано автоматически.

Ответы [ 2 ]

1 голос
/ 15 января 2012

Я предполагаю, что вы хотите, чтобы уравнения были равны 0, и чтобы в уравнениях не было знака равенства.

Разобрать выражения, чтобы найти коэффициенты - поместить в матрицу (A).Я использую здесь трюк, который предполагает, что переменные всегда x1 , x2 и т. Д. Также вы должны написать знак * для умножения.Функция FindCoeffs находит коэффициенты, присваивая переменным единицы и нули.Затем вы можете решить уравнения, используя linsolve .

 function FindEquations() 

     a = {'x1+x2 - 6 ','x1 - x2 - 2'};
     A = [];
     B = [];
     for i=1:numel(a)
        [b,l] = FindCoeefs(a{i}, numel(a));
        A(end+1,:) = l;
        B(end+1) = -b;
    end
    linsolve(A,transpose(B))
end

function [b,p] = FindCoeefs(expr, n)
    for j=1:n
        eval(sprintf('x%d=0;',j));
    end
    b = eval([expr ';']);

    p = zeros(1,n);
    for i=1:n
        for j=1:n
            eval(sprintf('x%d=0;',j));
        end
        eval(sprintf('x%d=1;',i));

        p(i) = eval([expr ';']) - b;    
    end

end
0 голосов
/ 24 июля 2017

Вы можете решить уравнение, хранящееся в массиве ячеек, используя:

solve(equs{:})

Работает и для неизвестного (в случае, если они не определены symvar):

uvar={x,y}
solve(equs{:},uvar{:})
...