假设半导体在TMin ~ TMax K之间变化,迁移率、扩散系数、少子寿命都不变(采用室温300K下的数值),τn0=10-6S,τP0=10-7s,ND=3×1015cm-3,NA=5×1016cm-3,分别画出硅和砷化镓理想反向饱和电流密度随温度的变化曲线的MATLAB 源程序
时间: 2023-12-14 15:40:03 浏览: 161
以下是硅和砷化镓理想反向饱和电流密度随温度的变化曲线的MATLAB 源程序:
```matlab
% 硅
k = 1.38064852e-23; % 玻尔兹曼常数
q = 1.60217662e-19; % 电荷量
T = linspace(200, 400, 201); % 温度范围
ni = 1.5e10*(T/300).^2.5*exp(-0.72*q/(k*T)); % 硅的本征载流子浓度
Vbi = k*T/q*log((NA*ND)/(ni^2)); % 内建电势垒
Is = q*ni^2*exp(Vbi/(k*T)); % 饱和电流密度
figure
semilogy(T, Is)
xlabel('温度(K)')
ylabel('饱和电流密度(A/cm^2)')
title('硅理想反向饱和电流密度随温度的变化曲线')
% 砷化镓
Eg = 1.424 + 1.247e-3*T - 5.405e-7*T.^2; % 砷化镓的能隙
ni = 2.1e6*(T/300).^1.5*exp(-Eg/(2*k*T)); % 砷化镓的本征载流子浓度
Vbi = k*T/q*log((NA*ND)/(ni^2)); % 内建电势垒
Is = q*ni^2*exp(Vbi/(k*T)); % 饱和电流密度
figure
semilogy(T, Is)
xlabel('温度(K)')
ylabel('饱和电流密度(A/cm^2)')
title('砷化镓理想反向饱和电流密度随温度的变化曲线')
```
注意,以上代码仅供参考,实际应用中需要根据具体情况进行调整。
相关问题
读入CSV文件并将TMAX和TMIN的值存储在两个列表tmax和tmin中
好的,你是用Python在处理CSV文件吗?那么可以使用`csv`模块来完成这个任务。下面是一个示例代码:
```python
import csv
# 读取CSV文件
with open('data.csv') as f:
reader = csv.reader(f)
# 跳过标题行
next(reader)
# 初始化tmax和tmin列表
tmax = []
tmin = []
# 遍历数据行
for row in reader:
# 将TMAX和TMIN的值添加到对应的列表中
tmax.append(float(row[1]))
tmin.append(float(row[2]))
# 输出结果
print("TMAX:", tmax)
print("TMIN:", tmin)
```
这个代码会打开一个名为`data.csv`的CSV文件,并将TMAX和TMIN的值存储在`tmax`和`tmin`两个列表中。请注意,这里假设CSV文件的第一行是标题行,因此我们使用`next(reader)`跳过它,然后遍历剩余的数据行。如果你的CSV文件没有标题行,可以删除这一行代码。另外,这里还假设TMAX和TMIN的值分别在CSV文件的第二列和第三列中,如果不是这样,需要相应地修改代码。
% 参数设置Cin = 1.1e6; % 室内空气等效热容Cwall = 1.86e8; % 墙体等效热容R1 = 1.2e-3; % 室内空气和墙体内侧的等效热阻R2 = 9.2e-3; % 墙体外侧和室外空气的等效热阻PN = 8e3; % 电采暖设备的额定功率Tin_init = 20; % 室内初始温度Tout_range = [0, -5, -10, -15, -20, -25]; % 室外温度变化范围dt = 60; % 时间步长% 控制器参数Kp = 100; % 比例系数Ki = 0.1; % 积分系数Kd = 10; % 微分系数Tset = 20; % 温度设定值Tmin = 18; % 温度下限Tmax = 22; % 温度上限u_min = 0; % 控制量下限u_max = PN; % 控制量上限% 初始化变量Tin = Tin_init * ones(24*60/dt, 1); % 室内温度Tout = Tout_range(randi(length(Tout_range), 24*60/dt, 1)); % 室外温度% 循环计算for k = 2:length(Tin) % 计算误差信号 e = Tset - Tin(k-1); % 计算控制量 u = Kp*e + Ki*dt*sum(e(1:k-1)) + Kd*(e(k-1)-e(k-2))/dt; % 限制控制量的范围 u = max(u_min, min(u_max, u)); % 计算电采暖设备的开关状态 S = u / PN; % 计算电采暖设备的制热功率 Pheat = S * PN; % 计算室内温度和墙体温度 Tin(k) = (Cin/R1 + Cwall/R2)*Tin(k-1) - (Cin/R1)*Tout(k-1) + (Pheat/R1)*dt + Tin(k-1); Twall(k) = (Cwall/R2)*Tin(k-1) - (Cwall/R2)*Tout(k-1) + (dt/(Cwall*R2))*Twall(k-1); % 限制室内温度的范围 Tin(k) = max(Tmin, min(Tmax, Tin(k)));end% 绘制室内温度和电采暖设备开关状态曲线t = (0:length(Tin)-1) * dt / 3600; % 时间轴,单位为小时figure;subplot(2,1,1);plot(t, Tin);xlabel('时间(h)');ylabel('温度(℃)');title('室内温度变化曲线');subplot(2,1,2);plot(t, S);xlabel('时间(h)');ylabel('开关状态');title('电采暖设备开关状态曲线');此段matlab代码中 u = Kp*e + Ki*dt*sum(e(1:k-1)) + Kd*(e(k-1)-e(k-2))/dt; 提示数组索引必须为正整数或逻辑值。正确修改后的代码
抱歉,我之前的回答有误。这个错误提示是由于在计算控制量u的时候,使用了e(k-2)的索引,但是由于循环变量k从2开始,所以在k=2的时候,e(k-2)就超出了索引范围。因此,需要在循环开始前先初始化一个变量e_prev,用来存储上一个时间步的误差信号e,然后在每次循环结束时将e_prev更新为当前的误差信号e。修改后的代码如下:
```
% 参数设置
Cin = 1.1e6; % 室内空气等效热容
Cwall = 1.86e8; % 墙体等效热容
R1 = 1.2e-3; % 室内空气和墙体内侧的等效热阻
R2 = 9.2e-3; % 墙体外侧和室外空气的等效热阻
PN = 8e3; % 电采暖设备的额定功率
Tin_init = 20; % 室内初始温度
Tout_range = [0, -5, -10, -15, -20, -25]; % 室外温度变化范围
dt = 60; % 时间步长
% 控制器参数
Kp = 100; % 比例系数
Ki = 0.1; % 积分系数
Kd = 10; % 微分系数
Tset = 20; % 温度设定值
Tmin = 18; % 温度下限
Tmax = 22; % 温度上限
u_min = 0; % 控制量下限
u_max = PN; % 控制量上限
% 初始化变量
Tin = Tin_init * ones(24*60/dt, 1); % 室内温度
Tout = Tout_range(randi(length(Tout_range), 24*60/dt, 1)); % 室外温度
e_prev = 0; % 上一个时间步的误差信号
% 循环计算
for k = 2:length(Tin)
% 计算误差信号
e = Tset - Tin(k-1);
% 计算控制量
u = Kp*e + Ki*dt*sum(e(1:k-1)) + Kd*(e(k-1)-e_prev)/dt;
% 更新上一个时间步的误差信号
e_prev = e(k-1);
% 限制控制量的范围
u = max(u_min, min(u_max, u));
% 计算电采暖设备的开关状态
S = u / PN;
% 计算电采暖设备的制热功率
Pheat = S * PN;
% 计算室内温度和墙体温度
Tin(k) = (Cin/R1 + Cwall/R2)*Tin(k-1) - (Cin/R1)*Tout(k-1) + (Pheat/R1)*dt + Tin(k-1);
Twall(k) = (Cwall/R2)*Tin(k-1) - (Cwall/R2)*Tout(k-1) + (dt/(Cwall*R2))*Twall(k-1);
% 限制室内温度的范围
Tin(k) = max(Tmin, min(Tmax, Tin(k)));
end
% 绘制室内温度和电采暖设备开关状态曲线
t = (0:length(Tin)-1) * dt / 3600; % 时间轴,单位为小时
figure;
subplot(2,1,1);
plot(t, Tin);
xlabel('时间(h)');
ylabel('温度(℃)');
title('室内温度变化曲线');
subplot(2,1,2);
plot(t, S);
xlabel('时间(h)');
ylabel('开关状态');
title('电采暖设备开关状态曲线');
```
阅读全文