前提・実現したいこと
移動平均を行うプログラムの制作して、実行させると誤差が出てしまうため、誤差をなくせるようにしたいこととそのプログラムの中で変数を宣言するとおかしな動作をしてしまうため解決したいです。
なお、移動平均の1~4回はdistanceの値をそのまま表示させたいと考えています。
5回目以降は移動平均を行いたいと考えており、0.12589...、0.14125…、0.11220…、0.1、0.112589と5つのdistanceの値をとり平均をと表示させ、データをずらして再計算したいと考えております。
発生している問題・エラーメッセージ
「前提・実現したいこと」で書いたような数値の移動平均をとっています。5回目以降の最新のデータが0,125895の時は、0,1573656…となってしまいます。正しくは、0.125895…に近い値が表示されるようにしたいです。決して前後に飛びぬけている値があるとかではないです。
下記のソースのB2の距離の移動平均のソースの部分に「sum1=0」と値の合計を0にしている部分があるのですが、これを記載してしまうと、移動平均が実行されず直前の「distance2」の値がそのまま表示されてしまいます。
デバッグしてみた結果、3つある配列ma、ma1,ma2の中身、5つ全部がmaはdistance、ma1はdistance1、ma2はdistance2の値になっていました。同じ値を5回足して5で割っている状態でした。この配列が全部同じdistanceのように更新されていく値を保持するためにはどうすれば良いのでしょうか。自分でも調べたり、ほかの変数に格納して、実行してみたのですがうまくは行きませんでした。
何度も質問し、それに付き合っていただき誠にありがとうございます。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5using UnityEngine.UI; 6using Mathd; 7using System.Linq; 8 9public class Pointer : MonoBehaviour 10{ 11 12 //入る変数 13 GameObject iBeacon; 14 //取得したscriptが入る変数 15 Test001 script; 16 17 double speed = 2.0f; 18 /* 19 //研究室は縦8.5m、横10.5m 20 //Unityは10倍 21 //iBeacon[B1]の座標 22 Vector3 B1 = new Vector3(-52.5,0,42.5); 23 //iBeacon[B2]の座標 24 Vector3 B2 = new Vector3(52.5, 0, 42.5); 25 //iBeacon[B3]の座標 26 Vector3 B3 = new Vector3(0, 0, -42.5); 27 */ 28 29 30 //自宅は縦3m、横3.5m 31 //Unityは10倍 32 //iBeacon[B1]の座標 33 Vector3 B1 = new Vector3d(-15, 0, 17.5); 34 //iBeacon[B2]の座標 35 Vector3 B2 = new Vector3d(15, 0, 17.5); 36 //iBeacon[B3]の座標 37 Vector3 B3 = new Vector3d(0, 0, -17.5); 38 39 40 //RSSI 41 private int RSSI; 42 private int RSSI1; 43 private int RSSI2; 44 45 //TxPower 46 private int TxPower; 47 private int TxPower1; 48 private int TxPower2; 49 50 //distance 51 public double distance; 52 public double distance1; 53 public double distance2; 54 55 public static double Pow; 56 double Va, Vb, x, z, y; 57 //int cnt = 5; 58 59 double[] ma = new double[5]; 60 //double mat = 0; 61 double[] ma1 = new double[5]; 62 double sum1 = 0; 63 //double t1 = 0; 64 65 double[] ma2 = new double[5]; 66 double sum2 = 0; 67 //double t2 = 0; 68 69 public Text textUI; 70 public Text textUUI; 71 public Text textUUUI; 72 73 Vector3d Basepoint; 74 public static int count; 75 int a; 76 int b = 2; 77 // Start is called before the first frame update 78 void Start() 79 { 80 iBeacon = GameObject.Find("IBeacon"); 81 script = iBeacon.GetComponent<Test001>(); 82 count = 0; 83 84 //RSSI持ってくるかも 85 RSSI = script.total; 86 RSSI1 = script.total1; 87 RSSI2 = script.total2; 88 89 TxPower = script.Strength; 90 TxPower1 = script.Strength1; 91 TxPower2 = script.Strength2; 92 a = 1; 93 //iBeaconMath(); 94 b = 1; 95 96 //現在地取得かも~~ 97 //transform.position = new Vector3d(x, 0.5, z); 98 99 } 100 101 // Update is called once per frame 102 void Update() 103 { 104 105 double step = speed * Time.deltaTime; 106 107 //RSSI持ってくるかも 108 RSSI = script.total; 109 RSSI1 = script.total1; 110 RSSI2 = script.total2; 111 112 TxPower = script.Strength; 113 TxPower1 = script.Strength1; 114 TxPower2 = script.Strength2; 115 116 IBeaconMath(); 117 //int c = 1; 118 119 /* 120 Vector3 devicepoint = new Vector3d(x, 0.5, z); 121 if(count == 0) 122 { 123 Basepoint = devicepoint; 124 count = 1; 125 } 126 127 transform.position = Vector3d.MoveTowards(Basepoint, devicepoint, step); 128 double tmpX = x; 129 double tmpZ = z; 130 Basepoint = new Vector3d(tmpX, 0.5, tmpZ); 131 */ 132 133 } 134 135 private void IBeaconMath() 136 { 137 138 139 int d = 0; 140 //B1の距離の移動平均 141 distance = Math.Pow(10.0, (TxPower - RSSI) / 20.0); 142 int h = 1; 143 144 int l = 1; 145 double mat = 0; 146 for(int j=0; j<5; j++) 147 { 148 149 mat += ma[j]; 150 } 151 int e = 1; 152 mat /= 5; 153 154 int f = 1; 155 for (int j=1; j<5; j++) 156 { 157 //mat = 0; 158 ma[j] = ma[j - 1]; 159 160 } 161 ma[0] = distance; 162 int g = 1; 163 164 //double result; 165 //result = t - distance; 166 167 168 //B2の距離の移動平均 169 distance1 = Math.Pow(10.0, (TxPower1 - RSSI1) / 20.0); 170 //sum1=0; 171 for (int i = 0; i < 5; i++) 172 { 173 174 sum1 += ma1[i]; 175 } 176 177 sum1 /= 5; 178 179 for (int i=4; i>0; i--) 180 { 181 ma1[i] = ma1[i - 1]; 182 } 183 184 ma1[0] = distance1; 185 186 187 //B3の距離の移動平均 188 distance2 = Math.Pow(10.0, (TxPower2 - RSSI2) / 20.0); 189 //sum2 = 0; 190 for (int k = 0; k < 5; k++) 191 { 192 sum2 += ma2[k]; 193 } 194 195 sum2 /= 5; 196 197 //sum2 /= 5; 198 for (int k = 4; k > 0; k--) 199 { 200 ma2[k] = ma2[k - 1]; 201 } 202 ma2[0] = distance2; 203 204 textUI.text = "B1との距離" + distance.ToString() + "m" + "\nB2との距離" + distance1.ToString() + "m" + "\nB3との距離" + distance2.ToString() + "m" + "\nB1のRSSI" + RSSI.ToString()+"db"+"\nB2のRSSI"+RSSI1.ToString()+"db"+ "\nB3のRSSI" + RSSI2.ToString() + "db"; 205 textUUI.text = "B1とのma距離" + mat.ToString() + "m" + "\nB2とのma距離" + sum1.ToString() + "m" + "\nB3とのma距離" + sum2.ToString() + "m"; 206 textUUUI.text = d.ToString() + h.ToString() + l.ToString() + e.ToString() + f.ToString() + g.ToString(); 207 208 /* 209 Va = ((Math.Pow(t1, 2) - Math.Pow(t2, 2)) - (Math.Pow(B2.x, 2) - Math.Pow(B3.x, 2)) - (Math.Pow(B2.z, 2) - Math.Pow(B3.z, 2))) / 2; 210 Vb = ((Math.Pow(t1, 2) - Math.Pow(t, 2)) - (Math.Pow(B2.x, 2) - Math.Pow(B1.x, 2)) - (Math.Pow(B2.z, 2) - Math.Pow(B1.z, 2))) / 2; 211 212 z = (Vb * (B3.x - B2.x) - Va * (B1.x - B2.x)) / ((B1.z - B2.z) * (B3.x - B2.x) - (B3.z - B2.z) * (B1.x - B2.x)); 213 x = (Va - z * (B3.z - B2.z)) / (B3.x - B2.x); 214 */ 215 216 217 218 219 220 221 222} 223
試したこと
自分が分かる範囲でソースを見直した
移動平均のソースを調べた。
補足情報(FW/ツールのバージョンなど)
C#
Unity2019.4.15f
visual stdio 2015
回答5件
あなたの回答
tips
プレビュー