在 MATLAB 中通过另一种方式选择晶粒尺寸或有效求解非线性方程

计算科学 matlab
2021-12-26 06:18:02

我有一个方程,基本上说,其中输出是所需的,取决于三个常数,输出取决于

J=A1(exp(VA2)1)+A3
JV

我的问题是我需要有效地解决的以下方程,η

J=B(exp(Cη)exp(Dη))+A3
我有是第一个公式的输出。与公式一中的参数相同。我的解决方案是 Newton-Raphson,但是当我的步长是线性设置时,这些计算所花费的时间非常慢。我的解决方案的一般程序是它使用已知变量绘制公式 1,从而产生感兴趣的点对 (V,J)。对于每个 J,求解公式 2以创建一系列新的 (V+ J) 兴趣点,以供进一步分析。我已经概述了该过程的示例脚本。J,B,C,D,A3JA3ηη

谁能想到一种以更有效的方式设置grain或stp_size的方法,或者提出一种更快的计算方法?我想要的输出也如下所示,它的一般形式对于以后的分析非常重要。

合资企业

函数计算

上限=1.8531;下限=-1.8531;

stp_size=0.001;

V=[下限:stp_size:上限];

对于 j = 1 : 1 : 长度 (V) J(1,j) = 5.5801*10^(-31) * ( exp(- 1 * V(j) / (1 * 8.6174*10^(-5) * 300))-1)*100 - 7.5265; %这是公式 (1) 如果 J(1,j) > 0 J(1,j) = 0; 结束结束

对于 j = 1:长度(V)J_BV(j) = (10^(-5) * ( exp( ( 1.7 * 1 * 9.6485*10^4 *V(j) )/(8.3145*300) ) - exp ( -(0.1 * 1* 9.6485*10^4 * V(j)/ (8.3145*300) ) ) )); 结尾

GIA = V + 1.2290;

输出=OP(GIA,-J);

对于 i = 1:长度(输出)如果 isnan(输出(i)) GIA(i)= NaN;J(i) = NaN;

end end

plot(GIA+OUTPUT, -J, 'p', 'displayname', 'desired output') 等一下;绘图(GIA,-J,'r','displayname','input')图例('toggle')xlim([-0.7 0.3])结束

函数 OUTPUT=OP(V, J)

输出 = 零(1,长度(V));

对于 j = 2:长度(V)B = 10^(-5);C = 1.7 * 1 * 9.6485*10^4/(8.3145*300);D = 0.1 * 1 * 9.6485*10^4/(8.3145*300);x_0 = 实数(-(8.3145*300 / (C * 1 * 9.6485*10^4)) * log( - J(1,j)/B )); %first guess clear x f_=@(x)B*( exp(C*(x) ) - exp(-D*(x)) ) - J(1,j); %这是公式(2)

if isinf(x_0)
    x_0=0;
end

options=optimset('TolX', 1*10^(-1));


if isinf( f_(x_0) )
    OUTPUT(1,j) = NaN;
else
    [ OUTPUT(1,j), fval, exitvalue ] = fzero( f_, x_0, options);
    if exitvalue == -3
        OUTPUT(1,j) = NaN;
    end

end
 end

结尾

1个回答

为什么不让 Matlab 为您完成所有工作?如果我理解正确,你有一个(因为你可以通过消除)或两个变量( )中的非线性方程对于两个变量的情况,将您的函数定义为JηηV

function [res] = F(X)
eta = X[1]
V = X[2]
A1 = 1.0; # these are just dummy values for your constants
A2 = 2.0;
A3 = 3.0;
B = 4.0;
C = 5.0;
D = 6.0;
res = A1*(exp(-V*A2)-1)+A3 - B*(exp(C*eta)-exp(-D*eta))-A3;
end

然后你让 Matlab(或 Octave)为你解方程:

fsolve(@F,X0)其中X0的初始猜测。ηV