首页 > 解决方案 > 如何为向量输入创建符号函数?

问题描述

我是 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

标签: matlab

解决方案


我认为您误解了 x = sym('x',[50 1]) 行。它将在工作区中创建从 x1 到 x50 的 50 个符号变量。但我认为您需要在工作区中定义 1 个变量 x ,然后您可以使用该 x 创建一个函数,以便您可以调用该函数,将大小为 50 的向量传递给它以获取相应的 fx 值。

如果您希望函数在 x 的所有值上进行评估,那么您需要使用函数 subs(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

请确保在声明符号函数时正确使用点 (.) 运算符,否则您可能会得到不正确的结果尺寸的意外结果。


推荐阅读