matlabについての質問です。  
ある領域において、  
端末を(1,5)から(1,18)の辺の間にランダムに配置し、  
その辺を上下に動かしたいです。

そのため無線端末の位置を(xi,yi)とし、  
1秒ごとにyの値を1ずつ増加さ  
せ、(1,18)に達したら今度はyの値を  
1ずつ減少させ、(1,5)に達したらまたyの値を1ずつ増加させるプログラムを作りたいです。

```

    xi = 1;
    yi = obj.yi_;
    if(yi >= 18)
        yi = obj.yi_ - 1;
    elseif(yi <= 5)
        yi = obj.yi_ + 1;
    end
    
```

とプログラムを組みましたが、このプログラムでは、  
(1,18)に達して以降ずっと(1,18)で止まってしまいます。

どうプログラムを変えれば、上手く動きますか？
CC BY-SA 4.0
2019-01-05T13:28:59.233
51736
2019-01-05T20:36:56.927
2019-01-05T20:36:56.927
3605
31674
question
matlab
matlab 辺上を動かしある点で跳ね返るプログラム
手元にMatlabの実行環境がないので、コードを読む限りで分かる問題について回答します。間違いがありましたら指摘をお願いします。

# 現状の実装について

```

    if(yi >= 18)
    yi = obj.yi_ - 1;
    elseif(yi <= 5)
    yi = obj.yi_ + 1;
    end
    
```

この部分のコードを噛み砕くと、「 `obj.yi_`の値が18以上なら `y` を 1減少させ、`obj.yi_`の値が5以下なら `yi` を
1増加させ、 **それ以外なら何もしない** 」というようになっています。

このため、記載されているコードを読む限り、以下のような問題点があります。

  * `6 <= obj.yi_ <= 17` の場合になにも起こらない
  * `obj` がどのように定義されているのか分からないため、正しい実装の示しようがない 
    * `(1,18)に達して以降ずっと(1,18)で止まってしまいます` とのことですので、どこかで上下に動かしている実装があるのでしょうか？
  * 現在の移動方向が示されていない 
    * 上2つについては、この質問に記載されていないだけでどこかに実装がある場合、問題ありません。しかし、主題である`(1,18)に達して以降ずっと(1,18)で止まってしまう`というのは、明らかに壁で跳ね返らずに現在の移動方向が正の方向のままであるのが原因です。

# 正しい実装の例

速度を表す`v`という変数を導入して、壁に跳ね返った時点でこれを逆方向に変換するのが良さそうです。今後、速度の変更や壁の弾性係数を指定することもできるでしょう。

```

    v = 1;
    xi = 1;
    yi = obj.yi_;
    if(yi >= 18)
    yi = obj.yi_ - 1;
    v = -v;
    elseif(yi <= 5)
    yi = obj.yi_ + 1;
    v = -v;
    end
    
```
CC BY-SA 4.0
2019-01-05T15:17:45.003
51741
2019-01-05T15:17:45.003
29826
51736
answer