2017-09-12 9 views
0

私はいくつかのアルゴリズムをテストするために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関数の丸めの問題でしょうか?

+2

あなたは、あなたが実現しなかったどこかの整数部を持っているように思えます。 'from __future__ import division'を使うと、ほとんどの場合除算は浮動小数点になります。これが問題の場合は、将来的にデータ型を慎重に検討することをお勧めします。 – user2357112

+0

@ user2357112私はそう思っています....あなたは絶対に正しいです...私はあなたがあなたが提案したものを行うことができるかどうかを知りませんでした...そしてまた、私は初めてPythonで "本当の"計算をしています。浮動小数点計算を行うと仮定しました。あなたがしたい場合は、答えとしてあなたのコメントを追加し、ポイントを得ることができます – morcillo

答えて

0

OK、私は答えを見つけましたが、ここに返信するのを忘れました。

最も重要なことは、変数xが間違っていること、np.arange(サンプル)ではないことです。これは0からサンプルまでの配列を与えますが、これは間違っています。私がそれを見た後、私は間違っていると気がついた...私は単純にそれをしました。なぜなら、ある範囲を多用して、このように使い終わったからです。x = np.arange(0,1/f 、1/Ts)であり、Ts = 1/fsである。私がやった後、すべてが完璧に動作するようになった。

だから、あなたが毎日使っている/していることがあっても、あなたはいつものように使いますか、何度かバグを防ぎ、数日間デバッグする

関連する問題