C语言迭代求解
0赞
发表于 2013/8/12 11:06:12
阅读(978)
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位