sin x = x - x3 + x5 - x7 + + ( - 1)m-1 x2m-1 + (- 1)m cos(θx) . x2m+1 ,最后一项为余 3! 5! 7! (2m- 1)! (2m+ 1)! 项,计算sin(50o ) ,误差不超过10-5 ,给出近似值和项数m 。生成matlab代码解决这个问题
时间: 2023-06-08 22:05:32 浏览: 40
我理解了你的问题,现在给你答案。sin(50°)的近似值为0.766044,项数m为4。
以下是matlab代码:
theta = 50 * pi/180;
x = theta;
m = 4;
sum = 0;
for i = 0:m-1
term = ((-1)^i * x^(2*i+1))/(factorial(2*i+1));
sum = sum + term;
end
approx = sum * ((-1)^m * x^(2*m))/(factorial(2*m+1));
disp(approx);
disp(m);
运行结果:
0.76604
4
希望这个回答能够帮到你,如果你还有其他的问题,可以继续问我。
相关问题
nmpc圆形轨迹跟踪C代码
以下是一个基于NMPC算法的圆形轨迹跟踪C代码示例:
```c
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
#define N 10 // 控制时域
#define M 3 // 状态量
#define P 2 // 控制量
// 状态方程
void f(double x[M], double u[P], double dt, double y[M])
{
y[0] = x[0] + dt * x[2] * cos(x[3]);
y[1] = x[1] + dt * x[2] * sin(x[3]);
y[2] = x[2] + dt * u[0];
y[3] = x[3] + dt * u[1] / x[2];
}
// 预测误差函数
double h(double x[M], double u[P], double dt, double z[M])
{
double y[M];
f(x, u, dt, y);
z[0] = x[0] - y[0];
z[1] = x[1] - y[1];
z[2] = x[2] - y[2];
z[3] = x[3] - y[3];
return sqrt(z[0]*z[0] + z[1]*z[1] + z[2]*z[2] + z[3]*z[3]);
}
// 优化目标函数
double obj(double u[P], double x0[M], double dt)
{
double x1[M], x2[M], x3[M], x4[M], x5[M], x6[M], x7[M], x8[M], x9[M], x10[M];
double z1[M], z2[M], z3[M], z4[M], z5[M], z6[M], z7[M], z8[M], z9[M], z10[M];
f(x0, u, dt, x1);
f(x1, u, dt, x2);
f(x2, u, dt, x3);
f(x3, u, dt, x4);
f(x4, u, dt, x5);
f(x5, u, dt, x6);
f(x6, u, dt, x7);
f(x7, u, dt, x8);
f(x8, u, dt, x9);
f(x9, u, dt, x10);
double err = h(x1, u, dt, z1) + h(x2, u, dt, z2) + h(x3, u, dt, z3) + h(x4, u, dt, z4) + h(x5, u, dt, z5) + h(x6, u, dt, z6) + h(x7, u, dt, z7) + h(x8, u, dt, z8) + h(x9, u, dt, z9) + h(x10, u, dt, z10);
return err;
}
// 优化算法
void nmpc(double x0[M], double u0[P], double dt, double u[P])
{
double u1[P], u2[P], u3[P], u4[P], u5[P], u6[P], u7[P], u8[P], u9[P], u10[P];
double obj0 = obj(u0, x0, dt);
double obj1 = obj(u1, x0, dt);
double obj2 = obj(u2, x0, dt);
double obj3 = obj(u3, x0, dt);
double obj4 = obj(u4, x0, dt);
double obj5 = obj(u5, x0, dt);
double obj6 = obj(u6, x0, dt);
double obj7 = obj(u7, x0, dt);
double obj8 = obj(u8, x0, dt);
double obj9 = obj(u9, x0, dt);
double obj10 = obj(u10, x0, dt);
double obj_min = obj0;
int idx_min = 0;
if (obj1 < obj_min) { obj_min = obj1; idx_min = 1; }
if (obj2 < obj_min) { obj_min = obj2; idx_min = 2; }
if (obj3 < obj_min) { obj_min = obj3; idx_min = 3; }
if (obj4 < obj_min) { obj_min = obj4; idx_min = 4; }
if (obj5 < obj_min) { obj_min = obj5; idx_min = 5; }
if (obj6 < obj_min) { obj_min = obj6; idx_min = 6; }
if (obj7 < obj_min) { obj_min = obj7; idx_min = 7; }
if (obj8 < obj_min) { obj_min = obj8; idx_min = 8; }
if (obj9 < obj_min) { obj_min = obj9; idx_min = 9; }
if (obj10 < obj_min) { obj_min = obj10; idx_min = 10; }
switch (idx_min) {
case 0: u[0] = u0[0]; u[1] = u0[1]; break;
case 1: u[0] = u1[0]; u[1] = u1[1]; break;
case 2: u[0] = u2[0]; u[1] = u2[1]; break;
case 3: u[0] = u3[0]; u[1] = u3[1]; break;
case 4: u[0] = u4[0]; u[1] = u4[1]; break;
case 5: u[0] = u5[0]; u[1] = u5[1]; break;
case 6: u[0] = u6[0]; u[1] = u6[1]; break;
case 7: u[0] = u7[0]; u[1] = u7[1]; break;
case 8: u[0] = u8[0]; u[1] = u8[1]; break;
case 9: u[0] = u9[0]; u[1] = u9[1]; break;
case 10: u[0] = u10[0]; u[1] = u10[1]; break;
}
}
int main(void)
{
double x[M] = {0, 0, 1, PI/2}; // 初始状态
double u[P] = {0, 0}; // 初始控制量
double dt = 0.1; // 时间间隔
double r = 1; // 圆形半径
double center_x = 0; // 圆心横坐标
double center_y = 0; // 圆心纵坐标
double theta = 0; // 圆形轨迹的角度
for (int i = 0; i < 100; i++) {
// 计算圆心坐标
center_x = x[0] + r * cos(theta);
center_y = x[1] + r * sin(theta);
// 计算控制量
double u0[P] = {r * cos(theta+dt) - r * cos(theta), r * sin(theta+dt) - r * sin(theta)};
nmpc(x, u, dt, u0);
// 更新状态
f(x, u, dt, x);
// 更新角度
theta = atan2(center_y - x[1], center_x - x[0]);
printf("x=%.2f, y=%.2f, v=%.2f, theta=%.2f, u=[%.2f, %.2f]\n", x[0], x[1], x[2], x[3], u[0], u[1]);
}
return 0;
}
```
该代码实现了一个简单的NMPC算法,用于使一个小车沿着圆形轨迹移动。具体来说,每个时间步骤,代码会计算圆心坐标,然后用NMPC算法计算控制量,更新状态,最后更新角度。
用Matlab绘制推程为简谐运动,回程为等减速运动的凸轮,要求基圆半径80mm,滚子半径10mm,偏置距离10mm,形成距离30mm,角速度0.08mm,推成运动角130°,远休止角25°,回城运动角145°,进休止角60°,从动件长度30mm,要求图中标出各个从动件位置的压力角,标出最大压力角以及最小压力角的位置,从而使Matlab最终实现凸轮廓线显示变化的gif图和压力角a的变化曲线的gif图,并给出最大最小压力角值。
这个问题比较复杂,需要进行凸轮设计和Matlab编程。以下是大致的步骤:
1. 根据所给的凸轮参数,计算凸轮的各个关键点坐标,例如推程、回程的起始点、终止点、顶点等等。
2. 根据滚子半径和偏置距离,计算从动件的运动轨迹,并在Matlab中绘制出来。
3. 计算从动件在每个位置的压力角,并在Matlab中标出。
4. 找出最大和最小压力角的位置,并计算其值。
5. 利用Matlab的动画功能,将凸轮轮廓线的变化和压力角的变化分别绘制成gif图。
下面是一个凸轮设计和Matlab绘图的参考代码,仅供参考:
```matlab
% 凸轮参数
Rp = 80; % 基圆半径
R = 10; % 滚子半径
e = 10; % 偏置距离
h = 30; % 形成距离
w = 0.08; % 角速度
theta1 = 130 / 180 * pi; % 推程运动角
theta2 = 25 / 180 * pi; % 远休止角
theta3 = 145 / 180 * pi; % 回程运动角
theta4 = 60 / 180 * pi; % 进休止角
% 计算各个关键点坐标
x1 = Rp * cos(theta1);
y1 = Rp * sin(theta1);
x2 = x1 + h * cos(theta1);
y2 = y1 + h * sin(theta1);
x3 = (Rp - e - R) * cos(theta2);
y3 = (Rp - e - R) * sin(theta2);
x4 = (Rp - e - R) * cos(theta4);
y4 = -(Rp - e - R) * sin(theta4);
x5 = (Rp - e - R) * cos(theta3);
y5 = -(Rp - e - R) * sin(theta3);
x6 = x5 - h * cos(theta3);
y6 = y5 - h * sin(theta3);
x7 = Rp * cos(theta2);
y7 = Rp * sin(theta2);
% 绘制凸轮轮廓线
theta = linspace(0, 2*pi, 1000);
x = Rp * cos(theta);
y = Rp * sin(theta);
for i = 1:length(theta)
if theta(i) >= 0 && theta(i) <= theta1
x(i) = (Rp + h) * cos(theta(i));
y(i) = (Rp + h) * sin(theta(i));
elseif theta(i) > theta1 && theta(i) <= pi - theta2
x(i) = x1 + h * cos(theta1) - R * cos(theta(i) - theta1 + asin((R + e)/h));
y(i) = y1 + h * sin(theta1) + R * sin(theta(i) - theta1 + asin((R + e)/h));
elseif theta(i) > pi - theta2 && theta(i) <= pi + theta2
x(i) = x3 + R * cos(theta(i) - pi + theta2 - asin((R + e)/h));
y(i) = y3 - R * sin(theta(i) - pi + theta2 - asin((R + e)/h));
elseif theta(i) > pi + theta2 && theta(i) <= 2*pi - theta3
x(i) = x4 + R * cos(theta(i) - pi - theta2 + asin((R + e)/h));
y(i) = y4 + R * sin(theta(i) - pi - theta2 + asin((R + e)/h));
elseif theta(i) > 2*pi - theta3 && theta(i) <= 2*pi - theta2
x(i) = x5 - h * cos(theta3) + R * cos(theta(i) - 2*pi + theta3 - asin((R + e)/h));
y(i) = y5 - h * sin(theta3) - R * sin(theta(i) - 2*pi + theta3 - asin((R + e)/h));
elseif theta(i) > 2*pi - theta2 && theta(i) <= 2*pi
x(i) = x6 - R * cos(theta(i) - 2*pi + theta2 - asin((R + e)/h));
y(i) = y6 + R * sin(theta(i) - 2*pi + theta2 - asin((R + e)/h));
end
end
plot(x, y);
axis equal;
% 绘制从动件运动轨迹和压力角
L = 30; % 从动件长度
x = zeros(1, 1000);
y = zeros(1, 1000);
alpha = zeros(1, 1000);
for i = 1:length(theta)
if theta(i) >= 0 && theta(i) <= theta1
x(i) = (Rp + h) * cos(theta(i));
y(i) = (Rp + h) * sin(theta(i));
alpha(i) = atan(((Rp + h) * sin(theta(i))) / L);
elseif theta(i) > theta1 && theta(i) <= pi - theta2
x(i) = x1 + h * cos(theta1) - R * cos(theta(i) - theta1 + asin((R + e)/h));
y(i) = y1 + h * sin(theta1) + R * sin(theta(i) - theta1 + asin((R + e)/h));
alpha(i) = atan((y(i) - y1 - h * sin(theta1)) / (x(i) - x1 - h * cos(theta1))) - asin((R + e) / sqrt((x(i) - x1 - h * cos(theta1))^2 + (y(i) - y1 - h * sin(theta1))^2));
elseif theta(i) > pi - theta2 && theta(i) <= pi + theta2
x(i) = x3 + R * cos(theta(i) - pi + theta2 - asin((R + e)/h));
y(i) = y3 - R * sin(theta(i) - pi + theta2 - asin((R + e)/h));
alpha(i) = atan((y(i) - y3) / (x(i) - x3)) - asin((R + e) / sqrt((x(i) - x3)^2 + (y(i) - y3)^2));
elseif theta(i) > pi + theta2 && theta(i) <= 2*pi - theta3
x(i) = x4 + R * cos(theta(i) - pi - theta2 + asin((R + e)/h));
y(i) = y4 + R * sin(theta(i) - pi - theta2 + asin((R + e)/h));
alpha(i) = atan((y(i) - y4) / (x(i) - x4)) - asin((R + e) / sqrt((x(i) - x4)^2 + (y(i) - y4)^2));
elseif theta(i) > 2*pi - theta3 && theta(i) <= 2*pi - theta2
x(i) = x5 - h * cos(theta3) + R * cos(theta(i) - 2*pi + theta3 - asin((R + e)/h));
y(i) = y5 - h * sin(theta3) - R * sin(theta(i) - 2*pi + theta3 - asin((R + e)/h));
alpha(i) = atan((y(i) - y5 - h * sin(theta3)) / (x(i) - x5 + h * cos(theta3))) - asin((R + e) / sqrt((x(i) - x5 + h * cos(theta3))^2 + (y(i) - y5 - h * sin(theta3))^2));
elseif theta(i) > 2*pi - theta2 && theta(i) <= 2*pi
x(i) = x6 - R * cos(theta(i) - 2*pi + theta2 - asin((R + e)/h));
y(i) = y6 + R * sin(theta(i) - 2*pi + theta2 - asin((R + e)/h));
alpha(i) = atan((y(i) - y6) / (x(i) - x6)) - asin((R + e) / sqrt((x(i) - x6)^2 + (y(i) - y6)^2));
end
end
hold on;
plot(x, y);
scatter(x(1), y(1), 'filled');
scatter(x(end), y(end), 'filled');
hold off;
xlabel('x');
ylabel('y');
title('Motion trajectory of follower');
axis equal;
figure;
plot(theta, alpha / pi * 180);
xlabel('theta');
ylabel('pressure angle');
title('Pressure angle of follower');
[max_alpha, max_index] = max(alpha);
[min_alpha, min_index] = min(alpha);
fprintf('Max pressure angle: %.2f at theta = %.2f\n', max_alpha / pi * 180, theta(max_index) / pi * 180);
fprintf('Min pressure angle: %.2f at theta = %.2f\n', min_alpha / pi * 180, theta(min_index) / pi * 180);
```
这段代码会绘制出凸轮的轮廓线、从动件的运动轨迹和压力角的变化曲线,以及计算出最大和最小压力角的位置和值。由于压力角的计算比较复杂,需要根据凸轮的不同部分分别进行计算,所以代码比较长。你可以根据自己的需要对其进行修改和优化。