Как создать символическую функцию для векторного ввода? - PullRequest
0 голосов
/ 21 декабря 2018

Я новичок в Matlab и мне интересно, как ввести вектор в символическую функцию.В документе сказано, что создание векторов по x = sym('x',[50 1]) и использование его для генерации целевой функции f(x), но это не сработает, если я хочу проверить значение функции, когда x = one (50,1), так каквход ожидает 50 переменных.

Как я могу изменить свой код для достижения этого?

m = 100;
n = 50;
A = rand(m,n);
b = rand(m,1);
c = rand(n,1);


% initialize objective function
syms x
f = symfun([c'* x - sum(log(A*x + b))],x);
tolerance = 1e-6

% Max iterations
N =1000;
% start point
xstart = ones(n,1)
% Method: gradient descent
% store step history 
xg =  zeros(n,N);
% initial point
xg(:,1) = xstart;

fprintf('Starting gradient descent.')';
for k = 1:(N-1)
    d = - gradient(f,xg(:,k));
    if norm(d) < tolearance
        xg = xg(:,1:k);
        break;
    end

1 Ответ

0 голосов
/ 22 декабря 2018

Я думаю, вы неправильно поняли строку x = sym ('x', [50 1]).Это создаст 50 символических переменных, начиная с x1 до x50 в рабочей области.Но я думаю, что вам нужно, чтобы в рабочей области была определена 1 переменная x, и позже вы можете использовать этот x для создания функции, чтобы вы могли вызывать эту функцию, передавая ей вектор размером 50, чтобы получить соответствующие значения fx.

Если вы хотите, чтобы функция была оценена при всех значениях x, вам необходимо использовать функцию sub (fx, x_points).

Пример кода приведен ниже.

    clc
    clear all

    m = 10;
    n = 10;
    A = rand(m,n);
    b = rand(m,1);
    c = rand(n,1);

    % declare the symbolic x variable
    syms x
    % declare the function
    f = symfun(c'* x - sum(log(A*x + b)), x);
    % declare the x data points
    x_points = ones(10,1);
    % substituting the x points within the f(x)
    evaluated_fx = subs(f, x_points)
% *********** perform the further operations below with the evaluated_fx

Убедитесь, что вы правильно используете оператор точки (.) При объявлении символической функции, иначе вы можете получить неожиданные результаты с неверными результирующими размерами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...