У меня есть данные, собранные в CSV каждого выхода модели трения.модель представляет контакт между поверхностями в виде одномерных щетинок, которые реагируют на изгиб, как пружины при этом отклонении.сила трения моделируется следующим образом:
FL(V,Z) = sig0*Z +sig1*DZ/Dt +sig2*V
где V - скорость поверхности Z - отклонение щетинок, а DZ / Dt - скорость отклонения, равная:
DZ/Dt = V + abs(V)*Z/(Fc + (Fs-Fc)*exp(-(V^2/Vs^2))
= V + abs(V)*Z/G(V)
= V + H(V)*Z
Где Fc - трение объекта в движении (постоянное), Fs равно Силе, необходимой для приведения объекта в движение (постоянная> Fc), а Vs - общая скорость, необходимая для перехода между доменами.(константа, которую я получил экспериментально).скорость и положение блока указаны в CSV, а также сила трения во времени.Я также создал легко интегрируемое приближение Скорости как функции времени (тригонометрическое).
В связи с проблемой: код не соответствует тому, как я пытаюсь передать списки в функции (я думаю).
Функция передает параметры SEEMS для работы(взят из другого файла, который просто отображает данные), однако я попытался численно интегрировать DZ / Dt и подогнать параметры sig к импортированным данным трения.
Что я импортировал
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from scipy import optimize
import pylab as pp
from math import sin, pi, exp, fabs, pow
Параметры
Fc=2.7 #N
Fs=8.2 #N
Vs=.34 #mm/s
Initial_conditions
ITime=Time[0]
Iz=[0,0,0]
Построение модели трения
def velocity(time):
V=-13/2*1/60*pi*sin(1/60*pi*time+pi)
return V
def g(v,vs,fc,fs,sig0):
G=(1/sig0)*(fc+(fs-fc)*exp(-pow(v,2)/pow(vs,2)))
return G
def h(v,vg):
H=fabs(v)/vg
return H
def findz(z, time, sig):
Vx=velocity(time)
VG=g(Vx,Vs,Fc,Fs,sig)
HVx=h(Vx,VG)
dzdt=Vx+HVx*z
return dzdt
def friction(time,sig,iz):
dz=lambda z,time: findz(z,time,sig)
z=odeint(dz,iz,time)
return sig[0]*z+sig[1]*findz(z,time,sig[0])+sig[2]*velocity(Time)
Должно возвращать разницу между построенной функцией и данными и выходомсписок, содержащий оптимизированные параметры
def residual(sig):
return Ff-friction(Time,sig,Iz)
SigG=[4,20,1]
SigVal=optimize.leastsq(residual,SigG)
print "parameter values are ",SigVal
Возвращает
line 56, in velocity
V=-13/2*1/60*pi*sin(1/60*pi*time+pi)
TypeError: can't multiply sequence by non-int of type 'float'
Это связано с тем, что я передаю списки?