查看单个帖子
旧 2019-11-25, 00:00   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
默认 How to enforce element-wise condition in matrix operations?

I am trying to use \ for Euler's backward method:



enter image description here



where dt and lambda are constant numbers like:



dt = 0.01
lambda = 0.5


and L is a sparse square matrix with the same size as x_old and x_new



Here is what I have tried:



x_new = (speye(size(x_old,2))- dt * lambda * L) \ x_old;


I had three questions:




  1. How to avoid the division in the elements of L that are 0?

  2. Is it OK to move (speye(size(x_old,2))- dt * lambda * L) to the
    other side, or should I maintain the formula's structure?.

  3. Am I supposed to use .* or .\ anywhere?



For the first question, I tried this but didn't work, because of the the matrix dimensions:



x_new = (speye(size(x_old,2))- dt * lambda * L(L~=0)) \ x_old;


For example, for these matrices:



full(L) = [4.6188    1.1547    1.1547    1.1547    1.1547;
1.1547 2.3094 0.5774 0 0.5774;
1.1547 0.5774 2.3094 0.5774 0;
1.1547 0 0.5774 2.3094 0.5774;
1.1547 0.5774 0 0.5774 2.3094]

x_old = [-0.4000 0 0.5000;
0.1000 -0.5000 0.5000;
0.1000 0 1.0000;
0.1000 0.5000 0.5000;
0.1000 0 0]


the result is like this:



x_new = [-0.407106857205753 8.52491160610484e-19    0.523921051079662;
0.0993707696612247 -0.505840945396493 0.511891327878594;
0.0993707696612247 3.20963195216710e-19 1.01773227327509;
0.0993707696612247 0.505840945396493 0.511891327878594;
0.0993707696612247 5.22659462097013e-19 0.00605038248210024]


which in command window looks like this:



x_new =

-0.4071 0.0000 0.5239
0.0994 -0.5058 0.5119
0.0994 0.0000 1.0177
0.0994 0.5058 0.5119
0.0994 0.0000 0.0061




More...
poster 当前离线   回复时引用此帖