这是我想在 MATLAB 中绘制的方程 -
我想将变量 Vbi 从 -5
扫描到 +5
,然后绘制变量 T
> 对于 Nd = Na =
10< 的 Vbi 的每个单独值(本质上是 T
与 Vbi
) support>15、1016 和 1017。
我知道 Vbi 可以通过创建向量来扫掠:
Vbi = -5 : 0.001 : 5;
但是我不知道如何解决这个问题,因为我从未遇到过类似的问题 这个之前。有人可以建议如何编码吗?
最佳答案
最简单的是使用循环遍历所需的所有值,并使用 fzero
查找非线性隐式函数的所有值:
% Values for Na/Nd you want
Na = [1e15 1e16 1e17];
Nd = Na;
% Vbi values you want to sweep
VbiValues = -5 : 0.001 : 5;
% Initialize outputs
Tout = zeros(numel(VbiValues), numel(Na));
% Solve equation for each value of Vbi
for ii = 1:numel(VbiValues)
for jj = 1:numel(Na)
% Re-define equation for new value of Vbi, Na, Nd
eq = @(T) -T + 11603.24*VbiValues(ii) ./ log(Na(jj)*Nd(jj)/2.798e39 * 300./T .* exp(13452./T));
% Solve it
Tout(ii,jj) = fzero(eq, 10);
end
end
% plot results
plot(...
VbiValues, Tout(:,1), 'r', ...
VbiValues, Tout(:,2), 'g', ...
VbiValues, Tout(:,3), 'b')
L = legend(...
'$N_A = N_D = 10^{15}$',...
'$N_A = N_D = 10^{16}$',...
'$N_A = N_D = 10^{17}$');
set(L, 'Interpreter', 'LaTeX');
或者,如果您有优化工具箱,则可以使用fsolve
:
function topLevelFunction
% Values for Na/Nd you want
Na = [1e15 1e16 1e17];
Nd = Na;
% Vbi values you want to sweep
VbiValues = -5 : 0.01 : 5;
% Use fsolve() to solve the system in one go
Tout = fsolve(@(T)F(T, VbiValues, Nd), ones(numel(Nd),numel(VbiValues)));
% plot results
plot(...
VbiValues, Tout(1,:), 'r', ...
VbiValues, Tout(2,:), 'g', ...
VbiValues, Tout(3,:), 'b')
L = legend(...
'$N_A = N_D = 10^{15}$',...
'$N_A = N_D = 10^{16}$',...
'$N_A = N_D = 10^{17}$');
set(L, 'Interpreter', 'LaTeX');
end
function Fvals = F(Ttrials, Vbis, Nad)
% Output function values for
% - all Vbi (each column is a different Vbi)
% - all Na/Nd (each row is a different Na/Nd)
Fvals = -Ttrials + bsxfun(@rdivide, ...
11603.24*Vbis(:).', ...
log( bsxfun(@times, Nad(:).^2/2.798e39, 300./Ttrials .* exp(13452./Ttrials)) ));
end
请注意,两个解决方案之一(或两个:)仍然包含错误,因为两个图不相同,但我确信这将帮助您入门。
关于MATLAB - 需要帮助绘制高度非线性函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21570368/