这是我想在 MATLAB 中绘制的方程 -
我想将变量 V bi从-5
to扫描+5
,然后为10 15、 10 16和 10 17T
的每个单独的 V bi值(基本上是T
vs. Vbi
)绘制变量。Nd = Na =
我知道 V bi可以通过创建一个向量来扫描:
Vbi = -5 : 0.001 : 5;
但是我不确定如何解决这个问题,因为我以前从未遇到过这样的事情。有人可以建议如何编码吗?
这是我想在 MATLAB 中绘制的方程 -
我想将变量 V bi从-5
to扫描+5
,然后为10 15、 10 16和 10 17T
的每个单独的 V bi值(基本上是T
vs. Vbi
)绘制变量。Nd = Na =
我知道 V bi可以通过创建一个向量来扫描:
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
请注意,两个解决方案之一(或两者:) 仍然包含错误,因为两个图不相同,但我相信这将帮助您入门。
实际上,将公式重新排列为 V 很简单。你为什么不重新制定并扫过 T 呢?
这样,您还可以查看是否有 T 没有解决方案(负值的日志左右)。
顺便说一句,如果这些量是物理 T(温度)和 V(体积),您可能会考虑不要超过负值...
更新
只是做了一些符号数学:
syms T V a b c reals
fun = a*V/(log(b/T*exp(c/T)))-T;
r =solve(fun==0,V);
然后在记事本上:
V = (T*log((b*exp(c/T))/T))/a
V = ( T* [log(b) + log(exp(c/T)) -log(T)] )/a
V = ( T* [log(b) + c/T -log(T)] )/a
V = c/a - T/a*log(T/b)
至少关系是单调的。所以解决方案将是独一无二的。
不是递归函数吗?像这样的东西?
您的第一个公式和键入的版本之间仍然存在一些差异。(300/T) 项有指数吗?