编译了一下,有兴趣的可以下下来玩玩
呆毛王镇楼
本文是上篇文章(XXXXXXXXXXXXXXXXXXXXXXXX/t/85479)的补充
上篇文章并未考虑电机力效的变化,而事实上电机力效的变化并不可忽略
现在讨论以续航为核心的最优策略,需要考虑电机力效的变化
精确考虑电机力效过于复杂,这里我们采用程序拟合
拟合我们直接用直线,系数的确定有两种算法
1.采用模拟退火算法(优点是方便改成其他曲线如抛物线之类)
#include<bits/stdc++.h>
#define double long double
using namespace std;
double x[1000];
double fx[1000];
double a=-0.004,b=6.0,A=-0.004,B=6.0;
int n;
double f(double x,double a1,double b1)//拟合的模型函数
{
return a1*x+b1;//这里可以改成任何函数进行拟合
}
double E(double a1,double b1)//计算方差
{
double ans=0;
for(int i=0;i<n;i++)
{
ans+=(fx[i]-(f(x[i],a1,b1)))*(fx[i]-(f(x[i],a1,b1)));
}
cout<<ans<<endl;
return ans;
}
void s(void)
{
double t=2000000.0;//温度
while(t>=0.000001)
{
double A=a+(((rand()%10000))-5000)*t;
double B=(b+(((rand()%10000))-5000)*0.00001*t);
if(E(A,B)<E(a,b))//如果新的系数方差比较小
{
a=A;
b=B;
}
t*=0.99;
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>x[i]>>fx[i];
for(int i=0;i<3;i++)
s();//退火
cout<<a<<" "<<b;
return 0;
}
有了拟合的关系式,我们就可以方便的用程序计算我们需要的电池选择策略
以群友提供的力效图为例
10
77 6.42
186 5
283 4.62
361 4.24
432 3.96
499 3.75
571 3.63
633 3.49
698 3.4
758 3.31
这组数据的效果:
画出图像
可见,拟合的效果还是可以的
但是缺点也明显--调参过于困难
2.回归直线法(优点是准确快速)
#include<bits/stdc++.h>
using namespace std;
double a,b,ax,ay,fm,fz,s;
double x[10000],y[10000],n;
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
ax+=x[i];
ax*=s;
ay+=y[i];
}
ax/=n;
ay/=n;
for(int i=1;i<=n;i++)
{
fz+=(x[i]-ax)*(y[i]-ay);
fm+=(x[i]-ax)*(x[i]-ax);
}
b=fz/fm;
a=ay-b*ax;
cout<<b<<" "<<a;
return 0;
}
根据前一篇文章的结论,我们知道
其中,t为续航时间,k1,k2分别是力效和电池容量(w/h)和质量(g)的比例
注意这里为了方便(厂商一般给的电机参数表都是以g为单位)质量单位为克
我们便可以写出计算无人机最佳电池质量的程序
#include<bits/stdc++.h>
using namespace std;
double a,b,ax,ay,fm,fz,k1,k2,md,s;
double x[10000],y[10000],n;
int main()
{
cin>>n>>s;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
ax+=x[i];
x[i]*=s;
ay+=y[i];
}
ax/=n;
ay/=n;
for(int i=1;i<=n;i++)
{
fz+=(x[i]-ax)*(y[i]-ay);
fm+=(x[i]-ax)*(x[i]-ax);
}
b=fz/fm;
a=ay-b*ax;
cin>>k2>>md;
double ansm=0,anst=0;
for(int m=1;m<100000;m++)
{
k1=b*(m+md)+a;
if(anst<(k1*k2*(m/(m+md))))
{
ansm=m;
anst=(k1*k2*(m/(m+md)));
}
}
cout<<ansm<<" "<<anst;
return 0;
}
比如说,用以上电机,电池采用特斯拉拆机18650(k2值在0.5左右),无人机本身重500g
那么我输入:
10 1//数据10组,轴数1
77 6.42
186 5
283 4.62
361 4.24
432 3.96
499 3.75
571 3.63
633 3.49
698 3.4
758 3.31
0.5 500//k2=0.5 无人机(不含电池)500g
程序便输出
366 0.532954
也就是说,最佳电池质量是366g 续航0.53小时
也就是大约7节18650
当然不可能上7节,所以我们上6节(3s2p)
这便是最佳电池策略(续航方面)
[修改于 3年9个月前 - 2021/03/13 21:42:32]
200字以内,仅用于支线交流,主线讨论请采用回复功能。