2020年4月14日學習日誌

學習了有關RC充電電路的知識:http://blog.sina.com.cn/s/blog_5640a5320102v9vw.html

進入正題前,我們先來回顧下電容的充放電時間計算公式,假設有電源Vu通過電阻R給電容C充電,V0爲電容上的初始電壓值,Vu爲電容充滿電後的電壓值,Vt爲任意時刻t時電容上的電壓值,那麼便可以得到如下的計算公式:        

 Vt = V0 + (Vu – V0) * [1 – exp( -t/RC)] 

 

如果電容上的初始電壓爲0,則公式可以簡化爲:       

 Vt = Vu * [1 – exp( -t/RC)] (充電公式)
  
由上述公式可知,因爲指數值只可能無限接近於0,但永遠不會等於0,所以電容電量要完全充滿,需要無窮大的時間。     當t = RC時,Vt = 0.63Vu; 
  
    當t = 2RC時,Vt = 0.86Vu;  

    當t = 3RC時,Vt = 0.95Vu;   

   當t = 4RC時,Vt = 0.98Vu; 
    當t = 5RC時,Vt = 0.99Vu; 
    可見,經過3~5個RC後,充電過程基本結束。  


    當電容充滿電後,將電源Vu短路,電容C會通過R放電,則任意時刻t,電容上的電壓爲: 
            Vt = Vu * exp( -t/RC)       (放電公式)

 

對於電路時間常數RC的計算,可以歸納爲以下幾點:   
       1).如果RC電路中的電源是電壓源形式,先把電源“短路”而保留其串聯內阻; 
       2).把去掉電源後的電路簡化成一個等效電阻R和等效電容C串聯的RC放電迴路,等效電阻R和等效電容C的乘積就是電路的時間常數; 
       3).如果電路使用的是電流源形式,應把電流源開路而保留它的並聯內阻,再按簡化電路的方法求出時間常數(將電流源等效變換爲電壓源分析);   
       4).計算時間常數應注意各個參數的單位,當電阻的單位是“歐姆”,電容的單位是“法拉”時,乘得的時間常數單位纔是“秒”。  
   對於在高頻工作下的RC電路,由於寄生參數的影響,很難根據電路中各元器件的標稱值來計算出時間常數RC,這時,我們可以根據電容的充放電特性來通過曲線方法計算,前面已經介紹過了,電容充電時,經過一個時間常數RC時,電容上的電壓等於充電電源電壓的0.63倍,放電時,經過一個時間常數RC時,電容上的電壓下降到電源電壓的0.37倍。 

明天把信號發射電路部分畫完。

 

最大子列和問題

四種方法,由慢到快。

#include<stdio.h>
#define MAXN 100000
int MaxSubSeqSum1(int N,int A[])
{
    int i,j,k;
    int ThisSum = 0;
    int MaxSum = 0;
    i=0;
    j=0;
    k=0;
    for(i=0; i<N; i++)
    {
        for(j=i; j<N; j++)
        {
            ThisSum = 0;
            for(k=i; k<j; k++)
            {
                ThisSum += A[k];
                if(ThisSum > MaxSum)
                    MaxSum = ThisSum; 
            }
        }
    }
    return MaxSum;
}
int MaxSubSeqSum2(int N,int A[])
{
    int i,j,k;
    int ThisSum = 0;
    int MaxSum = 0;
    i=0;
    j=0;
    for(i=0; i<N; i++)
    {
        ThisSum = 0;
        for(j=i; j<N; j++)
        {
            ThisSum += A[j];
            if(ThisSum > MaxSum)
                MaxSum = ThisSum; 
        }
    }
    return MaxSum;
}

int DivideAndConquer(int A[],int left,int right)
{
    int lans,rans,ans;
    int mid;
    int lmax,rmax,sum;
    int i;
    if(left==right)
    {
        return A[left];
    }
    
    mid = (left + right)/2;
    lans = DivideAndConquer(A,left,mid);
    rans = DivideAndConquer(A,mid+1,right);

    sum = 0;
    lmax = A[mid];
    rmax = A[mid+1];
    for(i=mid; i>=left; i--)
    {
        sum += A[i];
        if(sum > lmax) lmax = sum;
    }
    sum = 0;
    for(i=mid+1; i<= right; i++)
    {
        sum += A[i];
        if(sum > rmax) rmax = sum;
    }
    
    ans = rmax + lmax;
    if(lans > ans) 
    {
        return lans;
    }
    else if(rans > ans)
    {
        return rans;
    }

    return ans;


    
}

int MaxSubSeqSum3(int N,int A[])
{
    return DivideAndConquer(A,0,N-1);
}



int MaxSubSeqSum4(int N,int A[])
{
    int ThisSum = 0;
    int MaxSum = 0;

    int i = 0;
    for(i = 0; i<N; i++)
    {
        ThisSum += A[i];
        if(ThisSum > MaxSum)
            MaxSum = ThisSum;
        else if(ThisSum < 0)
        {
            i++;
            ThisSum = A[i];
        }
    }
    return MaxSum;
}

int main()
{
	int K, i;
	int a[MAXN] = {0};
	
	scanf("%d", &K);
	for ( i = 0; i < K; i++ )
		scanf("%d", &a[i]);
	printf("%d", MaxSubSeqSum3( K, a ));    //不同方法此處修改函數名即可。
	
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章