私はいくつかのアルゴリズムをテストするためにPythonで2つの正弦波を作成しています。特に位相間の遅延を測定して修正しました。なお、これは、異なる力率の電流変圧器によって追加された位相オフセットを補正するようになっている電源電圧と電流numpyにバグがありますか、何か間違っていますか?
from math import *
from random import randint
import numpy as np
import matplotlib.pyplot as plt
f = 60
fs = f * 144
sample = fs
def wave(peakv, peaki, angle = 0):
x = np.arange(sample)
vrms = 0
irms = 0
rads = 2 * np.pi
if angle == 0:
angulo = 0
offset = 0
else:
angulo = 360/angle
offset = rads/angulo
tcoffset = - rads * 6/ (360) #+ 1 * error * rads /360
offset = offset - tcoffset
v = peakv * np.sin(2*np.pi*x/fs) * 1.5035 + 0.6
i = peaki * np.sin(2 * np.pi * x/fs - offset) * 1.92 * 20 + 0.15
#rms
vrms = np.sqrt(np.dot(v, v)/sample)
irms = np.sqrt(np.dot(i, i)/sample)
#power
S = vrms * irms
Pa = 0
Pa = np.dot(v, i)
Pa /= sample
PF = Pa/S
print '------------------------------------------'
print 'Vrms = ', vrms
print 'Irms = ', irms
print 'Apparent power = ', S #* (angle * pi/180)
print 'Power = ', Pa
print 'Power factor = ', PF
print 'theta = ', np.arccos(PF) * 180/np.pi
print '************************************************'
print
print 'Using calibration ... '
#Calibrsating gain and offset
gv = (peakv/sqrt(2))/vrms
gi = (peaki/sqrt(2))/irms
ov = (max(v) + min(v))/2
oi = (max(i) + min(i))/2
v = gv * v - ov * gv
i = (gi * i - oi * gi)
#
prev = 0
#applying allpass filter
vout = np.arange(sample)
iter = 0
vout = [0] * sample
for n in np.nditer(v, op_flags=['readwrite']):
vout[iter] = n - 0.99332 * (n - vout[iter-1]) + prev
prev = n
#vout[iter] *= 0.49
iter += 1
v = vout
vrms = np.sqrt(np.dot(v, v)/sample)/149.84
irms = np.sqrt(np.dot(i, i)/sample)
S = (vrms * irms)
newp = np.dot(i, v)/sample/149.84
newPF = newp/S
print 'Corrected theta allpass = ', np.arccos(newp/S) * 180/np.pi
print 'Calibrated Voltage = ', vrms
print 'Calibrated Current = ', irms
print 'Calibrated Apparent Power = ', S
print 'Calibrated Active power = ', newp
print 'Calibrated Power Factor = ', newPF
print '------------------------------------------'
if __name__ == "__main__":
r = sqrt(2)
wave(127*r, 5*r, 70)
をシミュレートすることになっています。あなたが51,52,53を置くとき何らかの理由で@ 60°、0-50と90°で動作します...それは2つの位相と61-72の間の正確な同じ角度を計算し、次に80年代のそれは全く同じ値を与える。
numpyでエラーが発生する可能性は非常に低いと知っているので私のタイトルは間違いですが、私はアイデアがありません。ほとんどの値でテストしても問題はありません。多くの問題をプロットし、彼らは大丈夫と思われる。私の問題はそれらの値です...私は実際に何が起きているのか分かりません。おそらくnp.sin関数の丸めの問題でしょうか?
あなたは、あなたが実現しなかったどこかの整数部を持っているように思えます。 'from __future__ import division'を使うと、ほとんどの場合除算は浮動小数点になります。これが問題の場合は、将来的にデータ型を慎重に検討することをお勧めします。 – user2357112
@ user2357112私はそう思っています....あなたは絶対に正しいです...私はあなたがあなたが提案したものを行うことができるかどうかを知りませんでした...そしてまた、私は初めてPythonで "本当の"計算をしています。浮動小数点計算を行うと仮定しました。あなたがしたい場合は、答えとしてあなたのコメントを追加し、ポイントを得ることができます – morcillo