设a1=(5,-8,-1,2)T,a2=(2,-1,4,-3)T,a3=(-3,2,-5,4)T,从方程a≇
设a1=(5,-8,-1,2)T,a2=(2,-1,4,-3)T,a3=(-3,2,-5,4)T,从方程a1+2a2+3a3
设a1=(5,-8,-1,2)T,a2=(2,-1,4,-3)T,a3=(-3,2,-5,4)T,从方程a1+2a2+3a3
设三阶方阵A的特征值为1=1,2=2,3=3。对应的特征向量依次为
(1)将向量用a1,a2,a3线性表示;
(2)求A*p(n为正整数)。
设a1,a2,...,an是n个不同的数,而F(x)=(x-a1)(x-a2)...(x-an),b1,b2,...,bn是任意n个数,显然适合条件L(ai)=bi,i=1,2,...,n。这称为拉格朗日(Lagrange)插值公式。
利用上面的公式求:
1)一个次数<4的多项式f(x),它适合条件:f(2)=3,f(3)=-1,f(4)=0,f(5)=2。
2)一个二次多项式f(x),它在x=0,2/π,π处与函数sinx有相同的值。
3)一个次数尽可能低的多项式f(x),使f(0)=1,f(1)=2,f(2)=5,f(3)=10。
是两车的加速度曲线.那么位于这两条曲线和直线t=T(T>0)之间的图形的面积A所表示的物理意义是什么?
A.=A1^5
B.=A2+1
C.=A3+6x+1
D.=A4+1
阅读以下说明,以及用C++在开发过程中所编写的程序代码,将应填入(n)处的字句写在对应栏内。
【说明】
在下面函数横线处填上适当的字句,使其输出结果为:
构造函数.
构造函数.
1,2
5,6
析构函数
析构函数.
【C++代码】
include "iostream.h"
class AA
{ public;
AA(int i,int j)
{A=i; B=j;
cout<<"构造函数.\n";
}
~AA(){(1);}
void print();
private:
int A, B;
};
void AA∷print()
{cout<<A<<","<<B<<endl;}
void main()
{
AA *a1, *a2;
(2)=new AA(1, 2);
a2=new AA(5, 6);
(3);
a2->print();
(4) a1;
(5) a2;
}
设有集合(1,2,···,n),其无重复的一个排列(a1,a2,···,an)满足ai≠i(i=1,2,···,n),则称该排列为一个错列,求证集合(1,2,···,n)的错列的个数
请改正程序中的错误,使它能得到正确结果。
注意,不要改动主函数,不得删行或增行,也不得更改程序的结构。
源程序文件RevMain10.cpp中的程序清单如下:
//RevMain10.cpp
include <iostream>
using namespace std;
define N 30
int fun(int *x, int n);
int main ()
{
int h[N]={4,7, 6, 5, 1, 7,3, 8,0,2,3};
int i;
for (i=0; i<11; i++)
cout<<h [i] << " " ;
cout <<"/n";
fun(h, 11);
for (i=0; i<n; i++)
cout<<h [i]<<" ";
cout<<' \n';
return 0;
}
int fun(int *x, int n)
{
int i,t;
int a1=0, a2=0,min1=32767,min2=32676;
/* * * * *FOUND * * * * */
for(i=1;i<n;i++)
{
if (x [i]<min1)
{
min2=min1;
a2=a1;
min1=x [i];
a1=i;
}
else if (x [i] <min2)
{
min2=x [i];
a2=i;
}
}
/* * * * *FOUND * * * * */
t=x[0];x[a1]=x[0];x[a1]=t;
/* * * * *FOUND * * * * */
t=x[1] ;x[a2]=x[1];x[a2]=t;
}
设其中a1=(2,5,1,3),a2=(10,1, 5,10), a3=(4,1,-1,1),求a 。
试题四(15分)
阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
【说明】
某工程计算中要完成多个矩阵相乘(链乘)的计算任务。
两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算Am*n*Bn*p,需要m*n*p次乘法运算。
矩阵相乘满足结合律,多个矩阵相乘,不同的计算顺序会产生不同的计算量。以矩阵A110*100,A2100*5,A35*50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行10*100*5+10*5*50=7500次乘法运算;若按A1*(A2*A3)计算,则需要进行100*5*50+10*100*50=75000次乘法运算。可见不同的计算顺序对计算量有很大的影响。
矩阵链乘问题可描述为:给定n个矩阵<A1,A2,….An>,矩阵Ai的维数为pi-1*Pi,其中i = 1,2,….n。确定一种乘法顺序,使得这n个矩阵相乘时进行乘法的运算次数最少。
由于可能的计算顺序数量非常庞大,对较大的n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2*…*An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*….Ak和Ak+1*Ak+2*…*An两个子问题,则该最优解应该包含A1*A2*…*Ak的一个最优计算顺序和Ak+1*Ak+2*…An的一个最优计算顺序。据此构造递归式,
其中,cost[i][j]表示Ai+1*Ai+2*...Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。
【C代码】
算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵、…、n个矩阵相乘的最小计算量及最优计算顺序。下面是算法的C语言实现。
(1)主要变量说明
n:矩阵数
seq[]:矩阵维数序列
cost[][]:二维数组,长度为n*n,其中元素cost[i][j]表示Ai+1*Ai+2*…Aj+1的最优计算的计算代价
trace[][]:二维数组,长度为n*n,其中元素trace[i][j]表示Ai+1*Ai+2*Aj+1的最优计算对应的划分位置,即k
(2)函数cmm
define N 100
intcost[N][N];
inttrace[N][N];
int cmm(int n,int seq[]){
int tempCost;
int tempTrace;
int i,j,k,p;
int temp;
for(i=0;i<n;i++){ cost[i][i] =0;}
for(p=1;p<n;p++){
for(i=0; (1) ;i++){
(2);
tempCost = -1;
for(k = i;k<j;k++){
temp = (3) ;
if(tempCost==-1||tempCost>temp){
tempCost = temp;
(4) ;
}
}
cost[i][j] = tempCost;
trace[i][j] = tempTrace;
}
}
return cost[0][n-1];
}
【问题1】(8分)
根据以上说明和C代码,填充C代码中的空(1)~(4)。
【问题2】(4分)
根据以上说明和C代码,该问题采用了 (5) 算法设计策略,时间复杂度 (6) 。(用O符号表示)
【问题3】(3分)
考虑实例n=6,各个矩阵的维数:A1为5*10,A2为10*3,A3为3*12,A4为12*5,A5为5*50,A6为50*6,即维数序列为5,10,3,12,5,50,6。则根据上述C代码得到的一个最优计算顺序为 (7) (用加括号方式表示计算顺序),所需要的乘法运算次数为 (8) 。