学习了有关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;
}