2017-09-12 1 views
0

일부 알고리즘을 테스트하고 특별히 단계 사이의 지연을 측정하고 수정하기 위해 파이썬에서 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) 

메인 전압 및 전류를 시뮬레이션해야하는데. 그것은 0-50과 90 °에서 @ 60 °로 작동합니다 ... 51, 52, 53을 넣을 때 어떤 이유로 ... 2 단계와 61-72 사이의 정확한 각도를 계산 한 다음 80 년대는 똑같은 가치를 제공합니다.

numpy에서 오류가 발생할 확률은 매우 낮지 만 아이디어가 부족하다는 것을 알기 때문에 내 제목이 오해의 소지가 있습니다. 대부분의 값으로 테스트 할 때 장애없이 작동하며, 많은 문제로 그들을 계획해라. 그러면 그들은 ok 인 것처럼 보인다. 내 문제는 그 가치와 함께 ... 정말 무슨 일이 일어나고, 어쩌면 np.sin 함수 반올림 문제를 모르겠어요?

+2

당신은 실현되지 않은 어딘가에서 정수를 나누는 것처럼 들립니다. 'from __future__ import division'을 사용하면 대부분 실수 부 (division)가 강제로 부동 소수점이됩니다. 이것이 문제가되는 경우 향후 데이터 유형에 대해보다주의해야 할 수 있습니다. – user2357112

+0

@ user2357112 나는 그렇게 생각했다 .... 너는 절대적으로 옳다. 나는 네가 제안한 것을 할 수 있다는 것을 몰랐다 ... 또한 파이썬에서 "진짜"계산을하는 것은 나의 처음이다. 나는 간단히 말하면 부동 소수점 연산을 수행한다고 가정합니다. 원하는 경우 의견을 답변으로 추가하고 점수를 얻을 수 있습니다. – morcillo

답변

0

그래, 대답을 찾았지만 여기서 답장하는 것을 깜박했다.

가장 중요한 것은 변수 x가 잘못되었거나 np.arange (샘플)가 아니기 때문에 0에서 sample까지의 배열을 제공한다는 것입니다. 이는 잘못된 것입니다. 내가 그것을 본 후에 내가 잘못하고 있다는 것을 깨달았습니다 ... 나는 그저 많은 것을 사용했기 때문에 이것을했습니다. 이렇게하면 끝이났습니다 ... 그래서 x = np.arange (0, 1/f , 1/Ts)이고, Ts = 1/fs이다. 내가 한 후에 모든 것이 완벽하게 작동하기 시작했다.

그래서 ... 모든 사람을위한 메모는 매일 사용/수행하는 것처럼 생각하기 전에 항상 사용하는 것처럼 생각하십시오. 항상 그렇듯이 일부는 버그를 방지하고 며칠 동안은 디버깅을하지 않아도됩니다.

관련 문제