A + B Problem II(高精度)

本文介绍了一道经典的编程题目——大数加法问题。题目要求输入两个非常大的整数并计算它们的和,同时提供了样例输入输出。文章详细解释了解决方案的思路,包括如何处理大数的输入和计算过程,特别是对齐不同长度的大数进行加法运算的方法。

A + B Problem II

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 188211    Accepted Submission(s): 35956


Problem Description
I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.
 

 

Input
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.
 

 

Output
For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line is the an equation "A + B = Sum", Sum means the result of A + B. Note there are some spaces int the equation. Output a blank line between two test cases.
 

 

Sample Input
2
1 2
112233445566778899 998877665544332211
 

 

Sample Output
Case 1:
1 + 2 = 3
 
 
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
 

 

Author

 

Ignatius.L

    题意:

    给出 T (1 ~ 20)个case,后给出两个数a,b,每个数的长度最多1000位,求两个数加和按要求格式输出。

    

    思路:

    输入的顺序是从高位向地位输入,故计算的时候从 n -> 0 计算,并且考虑进位情况。考虑到数的输入输出情况,故开 char 型数组比较方便,计算的时候相应减去字符 0 即可。

    两个数的长度可能不一致,故先对其,前补0再计算,输出的时候不输出前导0,每个case之间要空一行,最后一个case不需要空行,大概注意这些就可以AC了。

 

    AC:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int main()
{
    int n,time = 0;
    scanf("%d",&n);
    while(n--)
    {
        int CIN = 0,len_a,len_b,len_sum;
        char a[1005],b[1005],sum[1005],temp[1005],temp_a[1005],temp_b[1005];
        time++;
        scanf("%s%s",a,b);
        len_a = strlen(a);
        len_b = strlen(b);
        len_sum = max(len_a,len_b);
        strcpy(temp_a,a);
        strcpy(temp_b,b);
        if(len_a > len_b)
        {
            int idex_b = 0,i;
            for(i = 0;i < len_a - len_b;i++)
                temp[i] = '0';
            for(i;i < len_a;i++,idex_b++)
                temp[i] = b[idex_b];
            for(i = 0;i < len_a;i++)
                b[i] = temp[i];
            b[i] = '\0';
        }

        if(len_b > len_a)
        {
            int idex_a = 0,i;
            for(i = 0;i < len_b - len_a;i++)
                temp[i] = '0';
            for(i;i < len_b;i++,idex_a++)
                temp[i] = a[idex_a];
            for(int i = 0;i < len_b;i++)
                a[i] = temp[i];
            a[i] = '\0';
        }
        for(int i = len_sum - 1;i >= 0;i--)
        {
            int ans = (a[i] + b[i] - '0' - '0' + CIN);
            sum[i] = ans % 10 + '0';
            CIN = ans / 10;
        }
        sum[len_sum] = '\0';
        printf("Case %d:\n",time);
        printf("%s + %s = ",temp_a,temp_b);
        if(CIN) printf("%d",CIN);
        puts(sum);
        if(n) printf("\n");
    }
    return 0;
}

 

 

 

<think>嗯,用户的问题是关于如何将传递函数转换为等效的状态变量模型,并用MATLAB比较不同输入下的时间响应。首先,我需要确认用户的需求。他们提到了两个传递函数,第一个是G(s)=(s+3)/(2s³+3s+7),第二个是G(s)=1/[(s+2+5j)(s+2-5j)(s+9)]。用户希望得到两种等效的状态变量模型,然后比较它们在单位阶跃和单位斜坡输入下的响应。 首先,我需要回忆一下如何将传递函数转换为状态空间模型。通常有两种标准形式:可控标准型和可观标准型。对于给定的传递函数,这两种形式的结构不同,但都能表示相同的系统。对于第一个传递函数,分母是2s³+3s+7,这里需要注意分母的阶次是否正确。因为分母是三次多项式,所以状态变量模型应该有3个状态变量。但检查一下原式,分母是2s³+3s+7,而分子是s+3,所以需要将传递函数写成严格真分式,即分子的阶次必须小于分母的。这里分子是s的一次,分母是三次,没问题。 接下来,可控标准型的转换方法是将传递函数的分母展开,得到各个系数。状态矩阵A的形式是一个伴随矩阵,B是[0;0;1],C由分子系数确定。不过需要注意,分母可能有缺项,比如这里的2s³+0s²+3s+7,所以在转换时要补上缺失的s²项的系数0。然后,状态空间矩阵的构造需要正确应用这些系数。 对于第二个传递函数,分母是三个因子相乘,包括复共轭对(s+2±5j)(s+9)。可能需要先将其展开成多项式形式,然后再转换为状态空间模型。或者,是否可以直接用部分分式分解或其他方法?不过状态空间转换通常需要多项式形式的分母,所以可能需要先展开分母。计算的话,(s+2+5j)(s+2-5j)等于(s+2)² +25,即s²+4s+4+25=s²+4s+29。然后乘以(s+9),得到(+4s+29)(s+9)=s³+9s²+4s²+36s+29s+261= s³+13s²+65s+261。所以分母多项式是s³+13s²+65s+261,分子是1,所以传递函数是1/(+13s²+65s+261)。这里分子是常数项,阶次低于分母,没问题。 接下来,生成可控和可观标准型的状态空间模型。对于这两个传递函数,我需要分别应用这两种方法。然后,在MATLAB中,可以使用tf2ss函数来转换,但需要确认是否得到的是可控标准型。可能用户希望手动构造或者用不同的方法得到两种形式? 然后,关于时间响应的比较。用户想比较单位阶跃和单位斜坡输入下的响应。在MATLAB中,可以使用step函数和lsim函数。对于单位斜坡输入,可能需要生成斜坡信号,比如t作为时间变量,输入是t。但要注意,对于状态空间模型,可能需要使用lsim,并指定输入为斜坡。 另外,用户提到要比较两种状态变量模型的响应,即可控和可观标准型是否在响应上有所不同。理论上,同一系统的不同状态空间表示应该有相同的输入输出响应,但由于数值计算的误差或者模型实现的差异,可能会有细微差别,但用户可能更关注理论上的正确性。 接下来,我需要考虑如何编写MATLAB代码。对于第一个传递函数G1,分子是[1 3],分母是[2 0 3 7]。注意分母的系数顺序是降幂排列,所以2s³+0s²+3s+7。当使用tf2ss时,可能需要将分母除以最高次幂的系数,即把传递函数标准化为1/(+ (0/2)+ (3/2)s +7/2)?或者是否应该保持原系数? 这里可能需要明确传递函数的标准形式。例如,原传递函数是 (s+3)/(2s³+3s+7),可以写成 (1/(2)) * (s+3)/(+ (3/2)s + 7/2)。这时候,分母的多项式系数是[1 0 3/2 7/2]。所以在构造状态空间模型时,需要考虑分母的系数是否已经被归一化。但通常,传递函数在MATLAB中可以表示为分子和分母多项式,不管是否归一化,只要系数正确即可。 对于第一个传递函数,正确的分母系数应该是[2 0 3 7],而分子是[1 3]。在MATLAB中,构造传递函数对象时,会正确处理这些系数。然后,用tf2ss转换为可控标准型,而可观标准型可能需要转置矩阵或者使用不同的方法。或者,是否可以通过调整转换方式来得到不同的形式? 例如,可控标准型的A矩阵是一个伴随矩阵,系数来自分母多项式,而可观标准型的A矩阵是伴随矩阵的转置。所以可能需要手动构造这两种形式,或者用不同的转换函数。 在MATLAB中,tf2ss默认返回的是可控标准型。要得到可观标准型,可能需要先转换传递函数为可观型,或者对可控型的矩阵进行转置和重新排列。 另外,用户提到两种等效的状态变量模型,所以可能需要分别展示可控和可观的实现方式。 对于第二个传递函数G2,分母展开后的多项式是s³+13s²+65s+261,分子是1。所以分子多项式是[1],分母是[1 13 65 261]。同样,用tf2ss得到可控标准型,然后构造可观标准型。 接下来,比较两种模型的响应。理论上,它们的时域响应应该相同,因为它们是同一系统的不同状态空间表示。但可能由于数值精度的问题,或者模型构造的方式不同,在仿真中可能会有微小差异,但用户可能需要确认这一点。 对于单位阶跃响应,step函数可以直接用于状态空间模型。对于单位斜坡输入,可能需要使用lsim,并生成斜坡信号,即输入u(t) = t。在MATLAB中,可以生成时间向量t,然后输入u = t,然后使用lsim(sys, u, t)。 然后,用户希望比较两种模型在不同输入下的响应。需要分别对每个传递函数的两种状态空间模型进行仿真,并绘制响应曲线,比较是否一致,并评论其差异或相似性。 总结步骤: 1. 将传递函数转换为可控标准型和可观标准型的状态空间模型。 2. 对于每个模型,使用MATLAB的step和lsim函数计算阶跃和斜坡响应。 3. 比较两种模型的响应曲线,验证是否一致,并分析可能存在的差异。 现在需要考虑如何手动构造可控和可观标准型,或者是否依赖MATLAB的函数。例如,可控标准型的构造: 对于传递函数G(s) = (b0 s^n-1 + ... + bn)/(s^n + a1 s^{n-1} + ... + an),可控标准型的矩阵A是: [0 1 0 ... 0 0 0 1 ... 0 ... -a0 -a1 ... -a_{n-1} ] 而B是 [0; 0; ...; 1],C是 [b0 b1 ... bn-1],D是 0。不过需要注意分母是否被归一化。例如,如果分母是2s³+3s+7,那么需要将其表示为s³ + 0s² + (3/2)s + 7/2,此时A矩阵的最后一行是 [ -0, -3/2, -7/2 ]。但原传递函数可能有分母系数不是1的情况,所以必须处理分母的最高次项的系数。 例如,对于传递函数G(s)=(s+3)/(2s³ +3s +7),可以写成 (1/(2))*(s+3)/(+ 0s² + (3/2)s +7/2)。这时候,分母多项式是s³ +0s² +1.5s +3.5,所以对应的可控标准型的A矩阵是: [0 1 0 0 0 1 -3.5 -1.5 0 ] B矩阵是 [0;0;1] C矩阵是 [ (3 - 0*(系数?可能需要再检查分子转换方式。一般来说,分子多项式需要根据分母归一化后的形式进行调整。比如,原来的分子是s+3,分母是2s³+3s+7,当归一化为分母为s³+0s²+1.5s+3.5时,分子变为 (s+3)/2。所以分子多项式是 (0.5)s + 1.5。因此,在可控标准型中,C矩阵的元素是这些系数减去相应的乘积吗? 或者,可能更系统的方法是使用严格的方法来构造可控标准型。假设传递函数为 (b0 s^{n-1} + b1 s^{n-2} + ... + bn-1)/(s^n + a1 s^{n-1} + ... + an),则状态空间的可控标准型为: A矩阵是 n x n 的矩阵,其中最后一行是 [-a1, -a2, ..., -an],其余行是单位矩阵的上三角部分,即第i行第i+1列是1,其余为0。 B矩阵是 [0; 0; ...; 1] C矩阵是 [b0, b1, ..., bn-1] D矩阵是0。 所以对于第一个传递函数G1(s)=(s+3)/(2s³+3s+7),首先需要将其分母转化为首一多项式,即除以2,得到分母s³ + 0s² + (3/2)s +7/2。此时,分子变为 (s+3)/2 = (1/2)s + 3/2。因此,对应的b0=1/2,b1=3/2,而分母的系数a1=0,a2=3/2,a3=7/2。所以可控标准型的A矩阵应该是: [0 1 0 0 0 1 -a3 -a2 -a1 ] 即: [0 1 0 0 0 1 -7/2 -3/2 0 ] 对吗?因为原分母多项式是s³ + a1 s² + a2 s + a3,其中这里a1=0,a2=3/2,a3=7/2。所以在构造A矩阵的最后一行时,应为[-a3, -a2, -a1],也就是[-7/2, -3/2, 0]。 而B是[0;0;1],C是[b0, b1, b2],但这里分子是(1/2)s +3/2,即次数是1次,而分母是3次,所以分子对应的系数是b0=1/2,b1=3/2,其余高次项系数为0?或者需要确认分子多项式如何对应到状态空间中的C矩阵。 例如,在传递函数为 (b0 s^{n-1} + ... + bn-1)/(s^n + a1 s^{n-1} + ... + an),则C矩阵是 [b0, b1, ..., bn-1]。 这里,原传递函数转换为首一多项式后,分母是s³ +0s² +1.5s +3.5,分子是0.5s +1.5。因此,分子是0.5s +1.5 = 0.5 s^2 * 1/(s^3) ...?或者可能需要将分子和分母都按相同的阶次排列。或者更准确地说,当分母是三次多项式,分子是一次多项式,因此分子可以写成0.5s +1.5,而分母是s³ +0s² +1.5s +3.5,所以传递函数是: (0.5 s +1.5)/(+0s² +1.5 s +3.5) 这时,分子对应的是b0=0(因为s²项的系数是0),b1=0.5(s项的系数),b2=1.5(常数项)。但这样是否符合可控标准型的构造? 或者,可能我之前搞错了。因为传递函数的分子次数为1,分母次数为3,所以分子多项式可以写成0*s^2 +0.5 s +1.5。因此,在构造C矩阵时,应为[0, 0.5, 1.5]。 这可能更正确。因为传递函数的分子是numerator = [0.5 1.5],对应的s的系数是0.5,常数项是1.5,而分母是三次的,所以对应的状态空间模型中,C矩阵应该是[0, 0.5, 1.5]。这样,当构造输出时,y = Cx + Du,这里的D是0,因此输出是0.5x2 +1.5x3,对吗? 这样的话,可控标准型的C矩阵是[0, 0.5, 1.5],而B矩阵是[0;0;1],A矩阵如之前所述。 同样的,可观标准型的状态空间矩阵是可控标准型的对偶,即A矩阵是可控标准型A的转置,B矩阵是C的转置,C矩阵是B的转置。所以,对于可观标准型,A矩阵是: [0 0 -7/2 1 0 -3/2 0 1 0 ] B矩阵是 [0; 0.5; 1.5] C矩阵是 [0 0 1] D矩阵是0。 这可能吗?或者需要更仔细的推导。构造可观标准型可能需要不同的步骤。 或者,可观标准型的构造方式是将传递函数的分子和分母系数以另一种方式排列。例如,对于传递函数G(s)= (b0 s^{n-1} + ... + bn-1)/(s^n + a1 s^{n-1} + ... + an),可观标准型的A矩阵是: [0 0 ... 0 -a1 1 0 ... 0 -a2 0 1 ... 0 -a3 ... 0 0 ... 1 -an ] B矩阵是 [b0; b1; ...; bn-1] C矩阵是 [0 0 ... 1] D矩阵是0. 这样看来,对于G1的可观标准型,A矩阵的结构是: [0 0 -7/2 1 0 -3/2 0 1 0 ] 因为a1=0,a2=1.5,a3=3.5?或者原来的分母是s³ +0s² +1.5s +3.5,所以a1=0,a2=1.5,a3=3.5? 那么A矩阵的最后列是[-a1, -a2, -a3]吗?或者这里的系数对应方式可能有不同。例如,在可观标准型中,A矩阵的最后列是[-a0, -a1, ..., -a_{n-1} }],而分母多项式是s^n +a1 s^{n-1} + ... + a_n。这可能需要重新确认。 例如,在可控标准型中,分母多项式是s^n +a1 s^{n-1} + ... + a_n,对应的A矩阵的最后一行是[-a1, -a2, ..., -a_n]。而可观标准型的A矩阵的结构是每个对角线下方是1,最后一列是[-a1, -a2, ..., -a_n]。或者可能我混淆了两种形式。 这个时候可能需要参考标准的状态空间转换方法。例如,根据资料,可控标准型的A矩阵是: [0 1 0 ... 0 0 0 1 ... 0 ... -a0 -a1 ... -a_{n-1} ] 而可观标准型的A矩阵是: [0 0 ... 0 -a0 1 0 ... 0 -a1 0 1 ... 0 -a2 ... 0 0 ... 1 -a_{n-1} ] 其中分母多项式为s^n + a_{n-1}s^{n-1} + ... + a0。这可能与之前的表示不同,需要注意系数的顺序。 这可能才是正确的。例如,如果分母多项式是s³ + a2 s² +a1 s +a0,那么可控标准型的A矩阵最后一行是[-a0, -a1, -a2]。而可观标准型的A矩阵最后一列是[-a0, -a1, -a2]。 回到我们的例子,传递函数G1的分母是2s³+3s+7,归一化为s³ +0s² +1.5s +3.5,所以这里的系数为: s³ + 0s² +1.5s +3.5 → 对应的系数为a0=3.5,a1=1.5,a2=0(因为s³ +a2 s² +a1 s +a0)。所以,对于可控标准型,A矩阵的最后一行是[-a0, -a1, -a2] = [-3.5, -1.5, 0]。而A矩阵的其他行是单位矩阵的上三角部分。 所以可控标准型的A矩阵是: [0 1 0 0 0 1 -3.5 -1.5 0 ] B矩阵是 [0;0;1] C矩阵是 [b0, b1, b2],其中分子多项式是(1/2)s +3/2,即0.5s +1.5。因为传递函数是(0.5s +1.5)/(+0s² +1.5s +3.5),所以分子可以视为0.5 s^1 +1.5 s^0。而分母是s^3 +0 s^2 +1.5 s^1 +3.5 s^0。所以分子多项式的阶次比分母低两次,所以对应到状态空间中的C矩阵是 [0.5, 1.5, 0]?或者需要确认如何将分子多项式转换为状态空间的C矩阵。 或者,根据传递函数分子为b0 s^{n-1} + ... + bn-1,当分母是n阶的情况下。在可控标准型中,C矩阵的元素是这些系数。例如,分子是0.5s +1.5,而分母是3阶,所以分子应表示为0 s² +0.5s +1.5,所以对应的系数b0=0, b1=0.5, b2=1.5,因此C矩阵是 [b0, b1, b2] = [0, 0.5, 1.5]. 因此,可控标准型的C矩阵是[0, 0.5, 1.5]。 而可观标准型的构造则不同。其A矩阵的结构是: A = [0 0 -a0; 1 0 -a1; 0 1 -a2] 这里,a0=3.5,a1=1.5,a2=0。因此,A矩阵为: [0 0 -3.5 1 0 -1.5 0 1 0 ] B矩阵是 [b0; b1; b2] = [0; 0.5; 1.5] C矩阵是 [0 0 1] D矩阵是0. 这样,两种状态空间模型的构造就完成了。对于G1的可控和可观标准型。 同样的,对于G2,传递函数是1/(+13s² +65s +261),所以分母多项式是s³ +13s² +65s +261,首项系数已经是1。分子是1,所以分子多项式是0 s² +0 s +1。因此,在可控标准型中,C矩阵是 [0, 0, 1],因为分子是1,即b0=0, b1=0, b2=1。对应的可控标准型: A矩阵: [0 1 0 0 0 1 -261 -65 -13 ] B矩阵:[0;0;1] C矩阵:[0,0,1] D矩阵:0 而可观标准型: A矩阵: [0 0 -261 1 0 -65 0 1 -13 ] B矩阵:[0;0;1] C矩阵:[0 0 1] D矩阵:0. 或者,是否这里可能混淆了系数?因为分母多项式是s³ +13s² +65s +261,对应a0=261,a1=65,a2=13。因此,在可控标准型中,A的最后一行是[-a0, -a1, -a2] = [-261, -65, -13],所以可控标准型的A矩阵: [0 1 0 0 0 1 -261 -65 -13 ] 而B是 [0;0;1], C是 [0,0,1]. 而可观标准型中的A矩阵是: [0 0 -261 1 0 -65 0 1 -13 ] B矩阵是 [0;0;1], C矩阵是 [0 0 1]. 现在,问题是如何在MATLAB中生成这两种状态空间模型。一种方法是手动构造矩阵,另一种是使用tf2ss函数,但需要注意该函数默认返回的是哪种形式。根据MATLAB文档,tf2ss返回的是可控标准型。因此,对于G1和G2,使用tf2ss可以得到可控标准型,而可观标准型可能需要手动构造或通过转换得到。 例如,对于G1: num = [1 3]; % s+3 den = [2 0 3 7]; % 2s^3 +0s² +3s +7 % 转换为首一多项式: den_normalized = den / den(1); % [1 0 1.5 3.5] % 此时,num也需要调整: num_normalized = num / den(1); % [0.5 1.5] % 然后构造可控标准型: A_controllable = [0 1 0; 0 0 1; -den_normalized(4) -den_normalized(3) -den_normalized(2)]; B_controllable = [0;0;1]; C_controllable = [num_normalized(2) num_normalized(3) 0]; 对吗?或者可能我的索引搞错了? 因为den_normalized是[1 0 1.5 3.5],即系数为s³ +0s² +1.5s +3.5,所以a0=3.5,a1=1.5,a2=0。在可控标准型的A矩阵中,最后一行是[-3.5, -1.5, -0]。而num_normalized是[0.5 1.5],即分子是0.5s +1.5。此时,对应的C矩阵应该为 [0.5, 1.5, 0]?或者是否要考虑分母的阶次? 或者,可能构造的方式是,对于传递函数G(s) = (b0 s^{n-1} + ... + b_{n-1})/(s^n + a1 s^{n-1} + ... + a_n),则C矩阵为 [b0, b1, ..., b_{n-1} ]. 在G1的例子中,分母是三次,分子是一次,所以分子可以写成0*s² +0.5*s +1.5。因此,C矩阵是 [0, 0.5, 1.5]. 所以在MATLAB中,构造可控标准型的矩阵为: A_controllable = [0 1 0; 0 0 1; -3.5 -1.5 0]; B_controllable = [0;0;1]; C_controllable = [0, 0.5, 1.5]; D_controllable = 0; 而可观标准型的矩阵: A_observable = [0 0 -3.5; 1 0 -1.5; 0 1 0]; B_observable = [0; 0.5; 1.5]; C_observable = [0 0 1]; D_observable = 0; 同理,对于G2,传递函数的分母展开后是s³ +13s² +65s +261,所以系数为 [1 13 65 261]. 分子是1,所以num = [1]. 转换为可控标准型: A_controllable_G2 = [0 1 0; 0 0 1; -261 -65 -13]; B_controllable_G2 = [0;0;1]; C_controllable_G2 = [0 0 1]; % 因为分子是1,即0s² +0s +1,所以C矩阵是 [0,0,1] D_controllable_G2 =0; 而可观标准型: A_observable_G2 = [0 0 -261; 1 0 -65; 0 1 -13]; B_observable_G2 = [0;0;1]; C_observable_G2 = [0 0 1]; D_observable_G2 =0; 现在,如何在MATLAB中实现这些?可能需要手动构造这些矩阵,或者使用tf2ss函数,然后比较结果。例如,对于G1,如果使用tf2ss,得到的矩阵是否和手动构造的一致? 例如,在MATLAB中: num = [1 3]; den = [2 0 3 7]; [A,B,C,D] = tf2ss(num, den); 得到的A、B、C、D是否符合可控标准型? 根据MATLAB的文档,tf2ss返回的可控标准型可能有所不同。例如,当传递函数不是首一多项式时,可能结果的结构不同。例如,当分母为2s³ +3s +7,MATLAB的tf2ss返回的A矩阵可能不是上述的可控标准型形式,因为分母的最高次项系数不是1。所以需要将传递函数转换为首一多项式,即分母除以2: num = [1 3]/2; den = [1 0 1.5 3.5]; 然后使用tf2ss: [A,B,C,D] = tf2ss(num, den); 这样得到的A、B、C、D是否与手动构造的一致? 例如,A矩阵应为: 0 1 0 0 0 1 -3.5 -1.5 0 而B是 [0;0;1] C是 [0 0.5 1.5] D是0. 这可能需要实际验证。 或者,可能更简单的方式是直接使用传递函数对象,然后转换为状态空间模型,并指定不同的形式。但MATLAB中的tf2ss可能只生成可控标准型,而可观标准型需要其他方法,比如转置矩阵。 因此,用户的问题可能需要手动构造两种标准型的状态空间模型,然后在MATLAB中实现。 接下来,编写MATLAB代码: 对于G1: % G1的传递函数 num1 = [1 3]; den1 = [2 0 3 7]; % 转换为首一多项式 den1_normalized = den1 / den1(1); % [1 0 1.5 3.5] num1_normalized = num1 / den1(1); % [0.5 1.5] % 可控标准型 A_controllable_G1 = [0 1 0; 0 0 1; -den1_normalized(4) -den1_normalized(3) -den1_normalized(2)]; B_controllable_G1 = [0; 0; 1]; C_controllable_G1 = [num1_normalized(2) num1_normalized(3) 0]; % 检查分子系数是否正确 % 但分子是0.5s +1.5,所以对应的系数为 [0.5, 1.5],而分母是三次,所以C矩阵应为 [0, 0.5, 1.5] 哦,刚才的构造有错误,因为在num1_normalized中,可能有三个系数。例如,当传递函数是三次分母,分子是s+3,转换为0.5s +1.5,所以分子多项式是0.5s +1.5,即s的系数是0.5,常数项是1.5,而s²项的系数是0。所以,对应的C矩阵应为 [0, 0.5, 1.5]. 因此,在构造时,应确保C矩阵的正确性。 所以,修正: C_controllable_G1 = [0, 0.5, 1.5]; 同理,可观标准型的构造: A_observable_G1 = [0 0 -den1_normalized(4); 1 0 -den1_normalized(3); 0 1 -den1_normalized(2)]; B_observable_G1 = [num1_normalized(1) num1_normalized(2) num1_normalized(3)]'; % 这里可能有问题,需要检查分子是否对应到可观标准型的B矩阵。 但根据之前的推导,对于可观标准型,B矩阵是分子多项式的系数。原分子多项式是0.5s +1.5,转换为三次分母的情况下,分子应为0*s² +0.5s +1.5,所以对应的系数是b0=0, b1=0.5, b2=1.5。因此,在可观标准型中,B矩阵应该是 [b0; b1; b2] = [0; 0.5; 1.5]. 因此,B_observable_G1 = [0; 0.5; 1.5]; C_observable_G1 = [0 0 1]; 这样,G1的可控和可观标准型的状态空间模型就构造完成了。 对于G2: num2 = [1]; den2 = conv([1 2+5j], conv([1 2-5j], [1 9])); % 计算den2展开后的多项式: % (s+2+5j)(s+2-5j) = s² +4s +29 % 再乘以(s+9):s³ +13s² +65s +261 den2_expanded = [1 13 65 261]; % 可控标准型 A_controllable_G2 = [0 1 0; 0 0 1; -261 -65 -13]; B_controllable_G2 = [0;0;1]; C_controllable_G2 = [0 0 1]; % 因为分子是1,即0*s² +0*s +1 D_controllable_G2 =0; % 可观标准型 A_observable_G2 = [0 0 -261; 1 0 -65; 0 1 -13]; B_observable_G2 = [0;0;1]; % 因为分子是1,对应b0=0, b1=0, b2=1 C_observable_G2 = [0 0 1]; D_observable_G2 =0; 接下来,在MATLAB中创建这些状态空间模型: sys_controllable_G1 = ss(A_controllable_G1, B_controllable_G1, C_controllable_G1, D_controllable_G1); sys_observable_G1 = ss(A_observable_G1, B_observable_G1, C_observable_G1, D_observable_G1); sys_controllable_G2 = ss(A_controllable_G2, B_controllable_G2, C_controllable_G2, D_controllable_G2); sys_observable_G2 = ss(A_observable_G2, B_observable_G2, C_observable_G2, D_observable_G2); 然后,比较它们的阶跃和斜坡响应: 对于阶跃响应: figure; step(sys_controllable_G1, 'r', sys_observable_G1, '--b'); legend('Controllable', 'Observable'); title('Step Response for G1'); figure; step(sys_controllable_G2, 'r', sys_observable_G2, '--b'); legend('Controllable', 'Observable'); title('Step Response for G2'); 对于斜坡响应: t = 0:0.01:10; u = t; % 单位斜坡输入 figure; lsim(sys_controllable_G1, u, t, 'r'); hold on; lsim(sys_observable_G1, u, t, '--b'); legend('Controllable', 'Observable'); title('Ramp Response for G1'); figure; lsim(sys_controllable_G2, u, t, 'r'); hold on; lsim(sys_observable_G2, u, t, '--b'); legend('Controllable', 'Observable'); title('Ramp Response for G2'); 观察这些响应是否一致。理论上,两种模型是等价的,所以响应应该重合。如果存在微小差异,可能是数值计算误差。 接下来,用户需要评论时间响应的结果。例如,单位阶跃输入下,两个模型的响应是否一致,单位斜坡输入下的稳态误差是否相同,响应曲线的形状如何,系统的稳定性等。 对于G1,分母多项式2s³+3s+7,根据劳斯判据,可能系统不稳定,导致阶跃响应发散?需要检查极点位置。例如,求分母的根: roots([2 0 3 7]) 在MATLAB中计算: roots([2 0 3 7]) → 可能会有一个实根和两个复根,或者全部实根。如果实部为负,则系统稳定,否则不稳定。 同样,G2的分母是(s+2+5j)(s+2-5j)(s+9),极点都在左半平面,因此系统稳定,阶跃响应会趋于稳定值,斜坡响应的稳态误差可能呈现某种特性。 总结,用户的问题需要: 1. 构造两种状态变量模型(可控和可观)。 2. 编写MATLAB代码实现。 3. 比较响应,并评论结果。 现在,将这些步骤整理成回答,并确保LaTeX格式正确,代码正确,引用可能存在的文献,生成相关问题。</think>### 传递函数转状态变量模型及时间响应分析 #### 一、状态空间模型推导 对于给定传递函数$G(s)=\frac{s+3}{2s^3+3s+7}$和$G(s)=\frac{1}{(s+2+5j)(s+2-5j)(s+9)}$,分别构造其可控标准型与可观标准型: 1. **G₁(s) = $\frac{s+3}{2s^3+3s+7}$** - **分母归一化**:$\frac{1}{2} \cdot \frac{s+3}{s^3 + 1.5s + 3.5}$ - **可控标准型**: $$ A_c = \begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ -3.5 & -1.5 & 0 \end{bmatrix},\ B_c = \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix},\ C_c = \begin{bmatrix} 0 & 0.5 & 1.5 \end{bmatrix} $$ - **可观标准型**: $$ A_o = \begin{bmatrix} 0 & 0 & -3.5 \\ 1 & 0 & -1.5 \\ 0 & 1 & 0 \end{bmatrix},\ B_o = \begin{bmatrix} 0 \\ 0.5 \\ 1.5 \end{bmatrix},\ C_o = \begin{bmatrix} 0 & 0 & 1 \end{bmatrix} $$ 2. **G₂(s) = $\frac{1}{(s+2+5j)(s+2-5j)(s+9)}$** - **分母展开**:$(s^2+4s+29)(s+9) = s^3 + 13s^2 + 65s + 261$ - **可控标准型**: $$ A_c = \begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ -261 & -65 & -13 \end{bmatrix},\ B_c = \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix},\ C_c = \begin{bmatrix} 0 & 0 & 1 \end{bmatrix} $$ - **可观标准型**: $$ A_o = \begin{bmatrix} 0 & 0 & -261 \\ 1 & 0 & -65 \\ 0 & 1 & -13 \end{bmatrix},\ B_o = \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix},\ C_o = \begin{bmatrix} 0 & 0 & 1 \end{bmatrix} $$ #### 二、MATLAB代码实现 ```matlab % G1状态空间模型 % 可控标准型 A_c1 = [0 1 0; 0 0 1; -3.5 -1.5 0]; B_c1 = [0; 0; 1]; C_c1 = [0 0.5 1.5]; D_c1 = 0; sys_controllable_G1 = ss(A_c1, B_c1, C_c1, D_c1); % 可观标准型 A_o1 = [0 0 -3.5; 1 0 -1.5; 0 1 0]; B_o1 = [0; 0.5; 1.5]; C_o1 = [0 0 1]; D_o1 = 0; sys_observable_G1 = ss(A_o1, B_o1, C_o1, D_o1); % G2状态空间模型 % 可控标准型 A_c2 = [0 1 0; 0 0 1; -261 -65 -13]; B_c2 = [0; 0; 1]; C_c2 = [0 0 1]; D_c2 = 0; sys_controllable_G2 = ss(A_c2, B_c2, C_c2, D_c2); % 可观标准型 A_o2 = [0 0 -261; 1 0 -65; 0 1 -13]; B_o2 = [0; 0; 1]; C_o2 = [0 0 1]; D_o2 = 0; sys_observable_G2 = ss(A_o2, B_o2, C_o2, D_o2); % 时间响应比较 t = 0:0.01:10; u_ramp = t; % G1阶跃响应 figure; step(sys_controllable_G1, 'r', sys_observable_G1, '--b'); legend('可控标准型', '可观标准型'); title('G1单位阶跃响应'); % G1斜坡响应 figure; lsim(sys_controllable_G1, u_ramp, t, 'r'); hold on; lsim(sys_observable_G1, u_ramp, t, '--b'); legend('可控标准型', '可观标准型'); title('G1单位斜坡响应'); % G2阶跃响应 figure; step(sys_controllable_G2, 'r', sys_observable_G2, '--b'); legend('可控标准型', '可观标准型'); title('G2单位阶跃响应'); % G2斜坡响应 figure; lsim(sys_controllable_G2, u_ramp, t, 'r'); hold on; lsim(sys_observable_G2, u_ramp, t, '--b'); legend('可控标准型', '可观标准型'); title('G2单位斜坡响应'); ``` #### 三、响应分析与评论 1. **G₁(s)的响应特性**: - **单位阶跃响应**:因极点分布包含正实部(通过`roots([2 0 3 7])`可得极点在右半平面),系统不稳定,响应发散。 - **单位斜坡响应**:发散趋势更明显,稳态误差无界。 2. **G₂(s)的响应特性**: - **单位阶跃响应**:极点均在左半平面(-9, -2±5j),系统稳定,响应收敛至稳态值。 - **单位斜坡响应**:稳态误差随输入斜率线性增长,符合II型系统特性[^1]。 #### 四、理论验证 - 两种状态空间模型(可控/可观标准型)在数学上等价,响应曲线应完全重合。实际仿真中可能因数值精度导致微小差异,但可通过误差分析忽略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值