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

7 篇文章 0 订阅
3 篇文章 0 订阅

前段时间研究步进电机的加减速(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[N] - table[N-1]),2))#每个时刻对应的频率,保留小数点后两位
        timevalue.append(int(80000000*(table[N] - 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。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值