您的位置:首页 > 其它

牛顿迭代法在求解步进电机在不同脉冲对应的时刻的用处

2015-03-08 22:57 260 查看
前段时间研究步进电机的加减速(S曲线)控制,需要求出电机在不同脉冲对应的时刻值。

需要求出电机在1,2,3....N个时刻的时刻 t 的值,公式如下:

N( t) = ( f 0 + C) t + τC (exp(-t*τ) - 1) (1)

变形为f(t) = ( f 0 + C) t + τC (exp(-t*τ) - 1) - N,需要求出N为不同值 f(t) = 0对应的 t 值 N 可以为0,1,2,3......(2k+1),也可以是0,2,4,6......(2K)。

显然人工笔算不太现实,由此想到了牛顿迭代。

证明知(1)式收敛,满足牛顿迭代条件。

python代码如下:

# -*- coding: cp936 -*-
import math

tao = 0.00050     #加速时间常数
f0  = 50.0       #50 Hz
fm  = 150000.0    #50 KHz
N   = 1
Datanum = 200
table   = [0.0]
timevalue = [0.0]
frequency = [0.0]

def f(x):
return (f0+fm)*x + tao*fm*(math.exp(-x/tao) - 1.0) - N
def fd(x):
return f0 + fm*(1.0 - math.exp(-x/tao))
def newtonMethod(k,assum):
time = k
x = assum
Next = 0
A = f(x)
B = fd(x)
#print('A = ' + str(A) + ',B = ' + str(B) + ',time = ' + str(time))
if f(x) == 0.000000000001:
return time,x
else:
Next = x - A/B
#print('Next x = '+ str(Next))
#if A == f(Next):
if math.fabs(Next - x) < 0.000000000001:
#if math.fabs(f(Next)) < 0.000000000001:
#print('Meet f(x) = 0,x = ' + str(Next))#设置迭代跳出条件,同时输出满足f(x) = 0的x值
table.append(x)#将时刻值保存在列表里
frequency.append(round(1/(table
- table[N-1]),2))#每个时刻对应的频率,保留小数点后两位
timevalue.append(int(80000000*(table
- table[N-1])+0.5))#求出每个脉冲的定时值,转化为整型数
else:
return newtonMethod(k+1,Next)

for N in range(1,Datanum+1,1):
newtonMethod(0,0.00001)

print ("不同脉冲对应的时刻值:")
print table[1:Datanum+1]
print ("不同脉冲对应的频率值:")
print frequency[1:Datanum+1]
print ("不同脉冲对应的计数值:")
print timevalue[1:Datanum+1]#定时器计数值

当然其他编程语言也可实现,例如C。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐