清霜一梦

C语言迭代求解

0
阅读(1156)

date : 2013/8/12           desinger :pengxiaoen 

今天看  国外电子信息科学经典教材系列   《电子电路分析与设计》 电子工业出版社的 的19页。看到里面的 求二极管的电流电压公式

 Vps = Vd  +  Id * R 

        = IsR【e ^(Vd/(n *Vt))   -  1】   + Vd  

其中反向饱和电流  Is 为常量数值在10^-15   ~  10^-13之间  ,取 10 ^-13A

Vt 为热力学电压 ,室温下 V = 0.026V

n为理想因素 ,1<= n <=2  .取值 1

在Vps = 5v 情况下   R = 2kΩ    如图   求出Vd  。因为是超越方程。所以可以用C 语言  采用 二分法  求解

程序中精度控制在 0.001 。就是允许有0.001 的误差。

常量   e=2.7182818

复制代码

 1 # include "stdio.h" 2 # include "math.h" 3  4 #define E   2.7182818 5 #define Vps 5 6 #define Vt 0.026 7 #define Is 1e-13 8 #define R 2e3 9 #define precision  0.00110 11 int main ()12 {                                     
13   float  Vd ;14   float y ;15   float temp=1 ;16   float updata=Vps ;17   float downdata = 0;18 19   Vd= Vps /2.0;20   while (temp > precision)21 //  if (temp > precision)22   {  
23      y = Vd / Vt;                                   
24      temp = Is * R * ( pow (E , y)-1) + Vd ;   
25      temp = Vps - temp ;                           
26      27      if (temp < 0) 
28      {29        updata = Vd;30        Vd = Vd - (updata -downdata)/2;31      }32      else 33      {34       downdata = Vd;35        Vd = Vd + (updata - downdata)/2;36      }37      38      temp = fabs (temp);           
39 40   }41   42   printf ("Vd = %.16lf\n",Vd);43   system ("pause");44 }

复制代码


if   else 中决定了 下一次 进入运算的Vd. 最后打印出的数据要求小数点后16位