MATLAB-需要帮助绘制高度非线性函数吗

MATLAB-需要帮助绘制高度非线性函数吗,matlab,plot,nonlinear-functions,Matlab,Plot,Nonlinear Functions,这是我想在MATLAB中绘制的方程- 我想将变量Vbi从-5扫到+5,然后为Nd=Na=1015、1016和1017的每个Vbi值(基本上是T与Vbi)绘制变量T 我知道通过创建向量可以扫描Vbi: Vbi = -5 : 0.001 : 5; 但我不知道如何着手解决这个问题,因为我从来没有遇到过这样的问题 这是以前的事。有人能告诉我如何编码吗?这不是一个递归函数吗?像这样的? 您的第一个公式和键入的版本之间仍然有一些差异。是否有(300/T)项指数?最简单的方法是使用循环遍历所有需要的值,

这是我想在MATLAB中绘制的方程-

我想将变量Vbi从
-5
扫到
+5
,然后为
Nd=Na=
1015、1016和1017的每个Vbi值(基本上是
T
Vbi
)绘制变量
T

我知道通过创建向量可以扫描Vbi:

Vbi = -5 : 0.001 : 5;
但我不知道如何着手解决这个问题,因为我从来没有遇到过这样的问题
这是以前的事。有人能告诉我如何编码吗?

这不是一个递归函数吗?像这样的?


您的第一个公式和键入的版本之间仍然有一些差异。是否有(300/T)项指数?

最简单的方法是使用循环遍历所有需要的值,并使用
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)

至少这种关系是单调的。因此,解决方案将是独一无二的。

您在matlab中尝试过吗?您有很多方法可以做到这一点。使用成员级运算符,如./或在for循环中解析它。@RobertP:euhm…他很麻烦;他手工写下方程式,拍了一张照片,上传到imgur,并在这里发布了链接,大概是为了解决他无法发布照片的问题。我认为这是正确的做法,因为隐式等式只有在排版而不是用代码编写时才显得足够“友好”。我只是负责排版;但是,
T
是未知的,
Vbi
是已知的。因此,除了反复试验之外,不可能找出
T
的正确范围,以获得
Vbi
的已知值。我在想,他也可以自由地对T进行一些限制。无论如何,
fzero
应该很容易找到T。一旦他知道了限制,可能会为他节省一些时间。