我需要创建一个形式的多项式:
P(x)= q(1,1)+ q(2,2)(xz(1))+ q(3,3)(xz(1))(xz(2))+ --- + q(2n,2n)(xz(1))(xz(2))...(xz(2n))注意:方程的索引已经移位以适应MATLAB。 < / p>
在MATLAB中。 Consult this link here specifically slides 15 and 16.
我填充了矩阵Q,所以我有对角线,并且我也填充了z(1:2n)。
我很难找到一种创建多项式的方法,我可以绘制这个多项式的图形。我尝试使用for循环将每个术语附加到P(x),但它并没有像我想象的那样运行。
到目前为止,我的代码将计算系数(在上面的问题中表示为Q(0,0) - > Q(2n + 1,2n + 1))而没有问题。
我对构造上述形式的n次多项式存在问题。绘图现在更有意义,创建一个带有评估值的向量x,然后通过多项式&#34;函数&#34;运行它们。并将x向量映射到结果向量。
所以我只需要创建这个多项式。
答案 0 :(得分:1)
我会使用diag
和cumprod
来帮助您完成此任务。首先使用diag
提取矩阵Q
的对角线。之后,使用cumprod
生成累积产品的矢量。
cumprod
对向量的工作原理是,对于向量中的每个元素,第i个元素从1到第i个元素收集产品。例如,如果我们有一个向量V = [1 2 3 4 5]
,cumprod(V)
会产生[1 2 6 24 120]
。第四个元素(作为示例)将是1*2*3*4
,表示从第1个元素到第4个元素的产品。
因此,这是我要做的代码:
qdiag = diag(Q);
xMinusZ = x - z; % Takes z and does x - z for every element in z
cumProdRes = cumprod(xMinusZ);
P = sum(qdiag .* [1;cumProdRes(1:end-1)]);
P
应该为您提供所需的P(x)
。确保z
是一个列向量,以使其与从Q
中提取的对角线兼容。
NB:我相信你的等式中有一个拼写错误。等式的最后一项(与您的惯例一致)应该是(x-z(2n-1))
而不是(x-z(2n))
。这是因为等式中的第一项没有z
。
这是一个例子。我们假设Q
已定义
Q = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
向量z
是:
z = [4;3;2;1];
让我们评估x = 2
提取Q
的对角线应该会给我们Q = [1;6;11;16]
。从x
的每个元素中减去z
应该给我们:
xMinusZ = [-2;-1;0;1];
使用上面的等式,我们有:
P = 1 + 6*(-2) + 11*(-2)*(-1) + 16*(-2)*(-1)*(0) = 11
这就是代码应该提供的内容。
正如您在帖子中所述,您希望对一系列x
值进行评估。因此,您需要修改代码,使其看起来像这样(确保x
是列向量):
qdiag = diag(Q);
xMinusZ = repmat(x,1,length(z)) - repmat(z',length(z),1);
cumProdRes = cumprod(xMinusZ,2);
P = sum(repmat(qdiag',length(z),1).*[ones(length(z),1) cumProdRes(:,1:end-1)],2);
P
现在应该为您提供输出向量,因此如果您想要绘制此输出,只需执行plot(x,P);