记录电子凸轮曲线的Matlab的多项式求解

记录一下电子凸轮曲线的求解,主要是多项式拟合求解,对指数或者三角函数的求解貌似使用Matlab没有解析解。问题是已知两点的位置和一次导或者高阶导来求解满足的多项式或者三角函数等,貌似机械里需要用到,手算应该也可以算出来。Matlab也可计算出来部分。

求解3次多项式拟合的.m文件如下

function getData()
syms a3 a2 a1 a0 x v0 v1
y = a3 * x * x * x + a2 * x * x + a1 * x + a0;
dy = diff(y, x);
eq1 = subs(y, x, 0) == 0;  % y(0) = 0 规范化
eq2 = subs(y, x, 1) == 1;  % y(1) = 1 规范化
% v0 = 1;
% v1 = 2;
eq3 = subs(dy, x, 0) == v0; % dy(0) = v0 期望值 
eq4 = subs(dy, x, 1) == v1; % dy(1) = v1 期望值
sol = solve([eq1, eq2, eq3, eq4],[a3, a2, a1, a0]); % 联立方程求解
sol = [ sol.a3, sol.a2, sol.a1, sol.a0]
% sol.a3
% sol.a2
% sol.a1
% sol.a0
end

计算结果如下

>> getData
 
sol =
 
[ v0 + v1 - 2, 3 - v1 - 2*v0, v0, 0]

类似的添加an和vn 可以拓展到高阶,貌似奇数阶用的比较多。

7次的电子凸轮曲线的.m代码和结果如下

function getData2()
syms a7 a6 a5 a4 a3 a2 a1 a0 x v0 v1 v2 v3 v4 v5
y =  a7 * x^7 + a6 * x ^6 + a5 * x^5 + a4 * x^4 + a3 * x * x * x + a2 * x * x + a1 * x + a0;
dy = diff(y, x);
ddy = diff(dy, x);
dddy = diff(ddy, x);
eq1 = subs(y, x, 0) == 0;
eq2 = subs(y, x, 1) == 1;
eq3 = subs(dy, x, 0) == v0;
eq4 = subs(dy, x, 1) == v1;
eq5 = subs(ddy, x, 0) == v2;
eq6 = subs(ddy, x, 1) == v3;
eq7 = subs(dddy, x, 0) == v4;
eq8 = subs(dddy, x, 1) == v5;
sol = solve([eq1, eq2, eq3, eq4, eq5,eq6, eq7, eq8],[a7, a6, a5, a4,a3, a2, a1, a0]);
sol1 = [sol.a3, sol.a2, sol.a1, sol.a0]
sol2 = [sol.a5, sol.a4]
sol3 = [sol.a7, sol.a6] 
% sol.a7
% sol.a6
% sol.a5
% sol.a4
% sol.a3
% sol.a2
% sol.a1
% sol.a0
end
>> getData2
 
sol1 =
 
[ v4/6, v2/2, v0, 0]
 
 
sol2 =
 
[ 45*v0 + 39*v1 + 10*v2 - 7*v3 + v4 + v5/2 - 84, (5*v3)/2 - 15*v1 - 5*v2 - 20*v0 - (2*v4)/3 - v5/6 + 35]
 
 
sol3 =
 
[ 10*v0 + 10*v1 + 2*v2 - 2*v3 + v4/6 + v5/6 - 20, (13*v3)/2 - 34*v1 - (15*v2)/2 - 36*v0 - (2*v4)/3 - v5/2 + 70]

考虑一个指数和三角函数的类似的求解,发现没有解析解。

function getData3()
syms a b c d  e f g h x v0 v1 v2 v3 v4 v5

y = a * sin( 2 * pi  / b * (x - c) + d  ) * exp( f * x + g )  ;
% y =  a7 * x^7 + a6 * x ^6 + a5 * x * x * x * x * x + a4 * x * x * x * x + a3 * x * x * x + a2 * x * x + a1 * x + a0;
dy = diff(y, x);
ddy = diff(dy, x);
dddy = diff(ddy, x);
eq1 = subs(y, x, 0) == 0;
eq2 = subs(y, x, 1) == 1;
eq3 = subs(dy, x, 0) == v0;
eq4 = subs(dy, x, 1) == v1;
eq5 = subs(ddy, x, 0) == v2;
eq6 = subs(ddy, x, 1) == v3;
eq7 = subs(dddy, x, 0) == v4;
eq8 = subs(dddy, x, 1) == v5;
sol = solve([eq1, eq2, eq3, eq4, eq5, eq6 , eq7 , eq8],[a, b, c, d, e, f, g, h]);
sol.a
sol.b
sol.c
sol.d
sol.e

end

得到的结果如下

>> getData3
警告: Cannot find explicit solution. 
> In solve (line 316)
  In getData3 (line 17) 
 
ans =
 
Empty sym: 0-by-1
 
 
ans =
 
Empty sym: 0-by-1

后面都是这种Empty ...

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值