-
Notifications
You must be signed in to change notification settings - Fork 0
/
vec_model.m
49 lines (40 loc) · 1.49 KB
/
vec_model.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function [est_strain] = vec_model(stress,w,step)
%{
Vectorized Implementation of the Physical Model
Arguments:
stress -- flow stress, an array (n_timestep,1)
w -- model parameters, an array (n_w,lamda) lamda:population size
step -- time step in numerical integration, a scalar
Returns:
est_strain -- estimated strain calculated from w (n_timestep,lamda)
%**********************************************************************
Author: https://github.com/xinyangyuan
%**********************************************************************
%}
% Retrive Training Parameters
n1 = w(1,:);
n2 = w(2,:);
A = w(3,:);
B = w(4,:);
C = w(5,:);
E = w(6,:);
k = w(7,:);
K = w(8,:);
% Initilize Variables
rho = zeros(size(stress,1),size(w,2));
R = zeros(size(stress,1),size(w,2)); % R = B*rho^(0.5)
ep = zeros(size(stress,1),size(w,2));
rho(1,:) = 0.0000001;%realmin to approx 0, since 0 -> math error
for i = 1:length(stress)-1
% Rate updating step
dep = ((stress(i+1,1)-R(i,:)-k)./K).^(n1); %broadcast stress array
drho = A.*(1-rho(i,:)).*dep - (C.*rho(i,:).^(n2));
dR = 0.5 *B.*(rho(i,:).^(-0.5)).*drho;
% Value updating step
ep(i+1,:) = eulerForward(ep(i,:),dep,step);
rho(i+1,:) = eulerForward(rho(i,:),drho,step);
R(i+1,:) = eulerForward(R(i,:),dR,step);
end
% Calulate the stress
est_strain = (stress./E) + ep;
end