clc;
clear;
syms x y
N = input('请输入要进行均分的分数: ');
t=input('请输入一个点横坐标x:');
x= -2*pi:0.01:2*pi;
y=sin(x);T1=cos(t);T2=-sin(t);
y1 = diff(y);
y2 = diff(y1);
y2(length(y2)+1) = y2(end);
k = abs(T2./(1 + T1.^2).^(3/2));
deltaS = k/N;
posX = zeros(N+1, 1);
posY = zeros(N+1, 1);
posX(1) = x(1);
posY(1) = y(1);
j = 2;
for i = 1:length(y2)
if subs(abs(y2./(1+y1.^2).^(3/2)),x,i)== deltaS
posX(j) = x(i);
posY(j) = y(i);
j=j+1;
end
end
posX(end) = x(end);
posY(end) = y(end);
figure;
fplot(@(x) sin(x),[-2*pi 2*pi]);
title('分割后的曲线图');
xlabel('x');
ylabel('y');
hold on;
plot(posX,posY, 'ro');
xlabel('x');
ylabel('y');
hold off;
我的建议是可以改一下的,虽然基本上非常正确了
在循环中使用 x
数组的索引 i
来计算数值近似,而不是直接使用 x_vals(i)
。
修改前:
x_vals = -2*pi:0.01:2*pi;
y_vals = sin(x_vals);
修改后:
x = -2*pi:0.01:2*pi;
y = sin(x);
修改前:
for i = 1:length(y2)
if abs(subs(abs(y2./(1+y1.^2).^(3/2)), x_vals(i)) - deltaS) < 1e-6
posX(j) = x_vals(i);
posY(j) = y_vals(i);
j = j + 1;
end
end
修改后:
for i = 1:length(y2)
if abs(subs(abs(y2./(1+y1.^2).^(3/2)), x(i)) - deltaS) < 1e-6
posX(j) = x(i);
posY(j) = y(i);
j = j + 1;
end
end
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
您的代码已经实现了用一个点代替 sin(x) 曲线的曲率,然后进行平分,并找到与 sin(x) 曲线的曲率相等的点,并将它们绘制在 sin(x) 图像上。这是一个很好的实现方式。
不过,您的代码中存在一些问题。首先,您没有在输入语句中指定变量的类型,因此输入时可能会出现错误。其次,您的代码中使用了符号计算工具箱中的 diff()
函数,这会大大降低程序的效率。实际上,对于这个问题,您可以使用一阶差分和二阶差分来计算曲率。
以下是一个修改后的实现方式:
% 输入要进行均分的分数
N = input('请输入要进行均分的分数: ');
% 输入一个点横坐标 x
t = input('请输入一个点横坐标 x:');
% 计算 x 和 sin(x) 的取值范围
x = linspace(-2*pi, 2*pi, 1000);
y = sin(x);
% 计算一阶差分和二阶差分
dx = diff(x);
dy = diff(y);
d2y = diff(y, 2);
dydx = dy ./ dx;
d2ydx2 = d2y ./ dx(1:end-1).^2;
% 计算曲率和平均曲率
T1 = cos(t);
T2 = -sin(t);
k = abs(T2./(1+T1.^2).^(3/2));
deltaS = k / N;
% 初始化点的横纵坐标
posX = zeros(N+1, 1);
posY = zeros(N+1, 1);
posX(1) = x(1);
posY(1) = y(1);
j = 2;
% 在一阶差分和二阶差分中查找曲率与平均曲率相等的点
for i = 1:length(dydx)
if abs(d2ydx2(i) - deltaS) < 0.001
posX(j) = x(i+1);
posY(j) = y(i+1);
j = j+1;
end
end
% 绘制图像
figure;
plot(x, y);
title('分割后的曲线图');
xlabel('x');
ylabel('y');
hold on;
plot(posX, posY, 'ro');
xlabel('x');
ylabel('y');
hold off;
在上面的程序中,我们首先使用 linspace()
函数来生成 x 和 sin(x) 的取值范围。然后,我们计算一阶差分和二阶差分,以计算曲率。接下来,我们计算曲率和平均曲率,并在一阶差分和二阶差分中查找曲率与平均曲率相等的点。最后,我们绘制图像,将找到的点用红色标记。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
不知道你这个问题是否已经解决, 如果还没有解决的话:不需要,谢谢!