學習了有關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;
}