matlab - 如何为向量输入创建符号函数?
问题描述
我是 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
解决方案
我认为您误解了 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
请确保在声明符号函数时正确使用点 (.) 运算符,否则您可能会得到不正确的结果尺寸的意外结果。
推荐阅读
- flutter - AppBar内的后退按钮在颤动中显示黑屏
- javascript - JavaScript:垂直遍历多维数组
- python-3.x - 没有安装候选时如何将 libpcre3-dev 添加到 docker 映像 python3.8-slim
- javascript - 单击单词以选择并作为答案提交
- apache-kafka - 我如何像关系数据库一样使用 Kafka
- django - 自动将 django 中的 user_id 和 date 字段更新到数据库中
- azure - Azure Web App 和 Azure SQL Server 的 VNet 集成
- python - ValueError:不允许负尺寸错误?
- flutter - Flutter:是否有可能将按钮值发送到文本字段?
- node.js - 谷歌工作表 api nodejs