将一个点(pi*1/2,1)带入求sin(x)的曲率公式里然后把所求的曲率当作sin(x)曲线曲率并进行均分成N分然后寻找几个点使其曲率等于均分的曲率并且最后将点出现在sin(x)的图像上

将一个点(pi*1/2,1)带入求sin(x)的曲率公式里然后把所求的曲率当作sin(x)曲线曲率并进行均分成N分然后寻找几个点使其曲率等于均分的曲率并且最后将点出现在sin(x)的图像上
clc;clear;
N = input('请输入要进行均分的分数: ');
t=input('请输入一个点横坐标x:');
x= -2*pi:0.01:2*pi;
y=sin(x);
y1 = diff(y);
y2 = diff(y1);
y2(length(y1)) = y2(end);
y3=subs(sin(x),x,t);y4=subs(cos(x),x,t);y5=subs(-sin(x),x,t);
k = abs(y5./(1 + y4.^2).^(3/2));
deltaS = k/N;
posX = zeros(N+1, 1);
posY = zeros(N+1, 1);
posX(1) = x(1);
posY(1) = y(1);
for i = 2:0.01
    if abs(y2(i)./(1+y1(i).^2).^(3/2))==deltasS
      posX(j) = x(i);
      posY(j) = y(i);
      j=j+1;
    end
posX(end)=x(end);
posY(end)=y(end);
end
figure;
fplot(@(x) sin(x),[-2*pi 2*pi]);
title('分割后的曲线图');
xlabel('X');
ylabel('Y');
hold on;
plot(posX,posY, 'r');
xlabel('X');
ylabel('Y');
hold off;

######然后运行之后报错
错误使用 sym/subs>normalize (line 231)
Entries in second argument must be scalar.

出错 sym/subs>mupadsubs (line 157)
[X2,Y2,symX,symY] = normalize(X,Y); %#ok

出错 sym/subs (line 145)
G = mupadsubs(F,X,Y);

出错 subs (line 68)
r_unique_name = subs(sym(f_unique_name),varargin{:});

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料以及问题的要求,我理解的问题是在sin(x)曲线上找到曲率等于给定曲率值的几个点,并将这些点绘制在sin(x)曲线上。

    关于求解曲率的问题,常见的方法是使用导数。曲线的曲率可以通过求解曲线的导数再进行求导来获取。但是,在这个问题中,我们无法直接通过求导来得到曲线的曲率,因为sin(x)函数的导数是cos(x),不包含相应的曲率信息。

    因此,我们需要使用其他方法来计算曲线的曲率。一种可行的方法是使用数值计算的方法来逼近曲线的曲率。下面我将详细说明如何使用该方法:

    1. 首先,我们需要定义一个函数来计算曲线的曲率。根据参考资料中提到的3阶贝塞尔曲线的特点,我们可以使用3个点来定义一个贝塞尔曲线,这里我们选用的3个点为(x, sin(x))(x + h, sin(x + h))(x + 2h, sin(x + 2h))。其中,xπ/2h为曲线上相邻两个点的间距,可以自行定义。曲线的曲率可以通过计算这3个点确定的贝塞尔曲线的曲率来近似。

    2. 接下来,我们需要定义一个函数来计算贝塞尔曲线的曲率。根据参考资料中提到的3阶贝塞尔曲线的曲率计算公式,我们可以计算出贝塞尔曲线的曲率。具体公式如下所示:

    def curvature(x, h):
        A = sin(x)
        B = sin(x + h)
        C = sin(x + 2 * h)
        curvature = (2 * (B - A) + C - B) / (h ** 2)
        return curvature
    
    1. 现在我们可以使用上述函数来计算曲线上每个点的曲率了。首先,我们可以定义一个目标曲率值,以及一个误差范围。然后,我们可以通过迭代计算曲线上每个点的曲率,直到找到与目标曲率值在误差范围内的点。一种简单的迭代方法是以固定的步长逐个点计算曲率,并与目标曲率值进行比较。具体步骤如下:
    def find_points(curvature_target, error):
        x = math.pi / 2
        h = 0.01  # 步长
        points = []
    
        while x >= -math.pi / 2:
            cur_curvature = curvature(x, h)
    
            if abs(cur_curvature - curvature_target) < error:
                points.append((x, sin(x)))  # 将满足条件的点添加到列表中
    
            x -= h  # 更新x的值,向左移动一个步长
    
        return points
    
    1. 最后,我们可以使用上述找到的点来绘制曲线上的点,以及原始的sin(x)曲线。绘制可以使用matplotlib库来完成。

    完整的代码如下:

    import math
    import matplotlib.pyplot as plt
    from numpy import sin
    
    def curvature(x, h):
        A = sin(x)
        B = sin(x + h)
        C = sin(x + 2 * h)
        curvature = (2 * (B - A) + C - B) / (h ** 2)
        return curvature
    
    def find_points(curvature_target, error):
        x = math.pi / 2
        h = 0.01  # 步长
        points = []
    
        while x >= -math.pi / 2:
            cur_curvature = curvature(x, h)
    
            if abs(cur_curvature - curvature_target) < error:
                points.append((x, sin(x)))  # 将满足条件的点添加到列表中
    
            x -= h  # 更新x的值,向左移动一个步长
    
        return points
    
    # 运行示例,曲率目标值为1
    points = find_points(1, 0.01)
    
    # 绘制曲线上的点
    x = [point[0] for point in points]
    y = [point[1] for point in points]
    plt.plot(x, y, 'ro', label='Points')
    
    # 绘制原始的sin(x)曲线
    x = [i * 0.01 for i in range(-314, 315)]
    y = [sin(val) for val in x]
    plt.plot(x, y, label='sin(x)')
    
    plt.legend()
    plt.show()
    

    通过运行上述代码,我们可以得到满足曲率等于给定曲率值的点,并将其绘制在sin(x)曲线上。

    请注意,上述代码中使用了数值计算的方法来近似计算曲线的曲率,并且使用了一个误差范围来判断是否满足给定的曲率值。因此,最终得到的结果可能并不是完全精确的解,但是可以提供一个近似的解。

    希望这个解决方案能够帮助到您,如果您有任何进一步的问题或需要进一步的解释,请随时提问。