POJ——1045(2011-04-23)

来源:互联网 发布:php md5 编辑:程序博客网 时间:2024/05/16 07:42

Description
考虑下面的交流电路。假定电路在稳态。因此,节点1的电压和节点2的电压分别是v1 = VS coswt 和 v2 = VRcos (wt + q),其中Vs是电源电压,w是频率(弧度每秒),t是时间。VR是电阻R两端电压下降的幅度,q是它的相位。
POJ 1045 Bode Plot - Icho - Brian Warehouse
你需要写一个程序,以确定不同的w对应的VR值。您将需要两个电学定律来解决这个问题。第一个是是欧姆定律,表述为V2 = iR,其中i是在电路顺时针流向的电流大小。第二个是i = C d/dt (v1-v2),i与电容器两板上的电压有关。"d/dt" 意为求关于t的求导。
Input
输入包括一行或多行。第一行包括三个实数和一个非负整数。实数按顺序是VS,R,C。整数n是测试用例的个数。接下来的n行就是输入,要求一行一个实数,代表w的值。

Output
输出n行的VR值,注意,结果精确到小数点后三位。下面需要推导一下求VR的公式:
V2=iR=CR d/dt (VS*cos(wt)-VR*cos(wt+q))=V1=VRcos(wt+q)
--->CR w (VRsin(wt+q)-VSsin(wt))=VRcos(wt+q)

首先令t=0,得CRw  tan q = 1 ;(式1)

接着令wt+q=0(此时wt=-q),得VR=CRw VS sin q;(式2)
然后利用三角函数公式,由tan q求得sin q,将sin q 代入式 2求得 :

VR = CRw VS / sqrt (1+ (CRw) ^ 2 ));

代码:

#include <iostream>
#include <cmath>
#include <iomanip>//用到setiosflags(ios::fixed)和setprecision(3)时要包含该头文件
using namespace std;
int main()
{
  double vs,r,c,w,vr;
  int n,i;
  cin>>vs>>r>>c>>n;

  for(i=1;i<=n;i++)
  {
    cin>>w;
    vr=c*r*w*vs / sqrt(1+c*c*r*r*w*w);
    cout<<setiosflags(ios::fixed)<<setprecision(3)<<vr<<endl;

    //虽然他要求输出是N行,但这样一行输入对应一行输出貌似也可以
  }
  return 0;
}