Я использую фортран для написания подпрограммы для реализации определяющего уравнения, заданного (A + B*(strain**xn))*(one - T_star**xm)* (one + C*edot_log)
в ABAQUS.Я получаю значение yield для каждой итерации, добавляя значения штаммов, T_star и edot_log из предыдущей итерации.Тем не менее, мой код также включает в себя три дифференциации
1). выход (км) относительно штамм
2). выход (км) относительно фильтрата
3). выход (км) относительно T
В настоящее время я нахожу производную вручную, а затем записываю уравнения:
dyieldDeqps(km,1) = (B*xn*(strain**(xn-one)))*
1 (one - T_star**xm) * (one + C*edot_log)
dyieldDeqps(km,2) = (A + B*(strain**xn))*
1 (one - T_star**xm) * (C/strainrate)
dyieldDtemp(km) = (-xm)*(one/(T - T_trans))*
1 (T_star**(xm))*(A + B*(strain**xn))
2 *(one + C*edot_log)
Это прекрасно работает, но есть ли способ найти производные непосредственно из уравнения доходности (A + B*(strain**xn))*(one - T_star**xm)* (one + C*edot_log)
.
Любая помощь или предложение будет наиболее полезным.Я не знаю, как это сделать?
Соответствующие части подпрограммы Фортран:
T_star = (T - T_trans)/(T_melt - T_trans)
strainrate = eqpsRate(km)/epsdot0
edot_log = LOG( strainrate )
yield(km) = (A + B*(strain**xn))*(one - T_star**xm)
1 * (one + C*edot_log)
IF( strain .le. zero) THEN
dyieldDeqps(km,1) = zero
ELSE
dyieldDeqps(km,1) = (B*xn*(strain**(xn-one)))*
1 (one - T_star**xm) * (one + C*edot_log)
ENDIF
IF(strainrate .ge. epsdot0) then
dyieldDeqps(km,2) = (A + B*(strain**xn))*
1 (one - T_star**xm) * (C/strainrate)
ELSE
dyieldDeqps(km,2) = one
ENDIF
IF (T .gt. T_trans) THEN
dyieldDtemp(km) = (-xm)*(one/(T - T_trans))*
1 (T_star**(xm))*(A + B*(strain**xn))
2 *(one + C*edot_log)