Matlab 使用迭代的数值方法求一个圆的切线

Matlab 使用迭代的数值方法求一个圆的切线,matlab,geometry,octave,numerical-methods,Matlab,Geometry,Octave,Numerical Methods,给定:两个圆的中心和半径 我的问题是,我不知道如何使用数值方法找到一个圆的切线。使用matlab/octave,我会知道如何手工求解,但不知道如何使用matlab/octave 正是这个问题给我带来了困难。即建立方程组。在上面的网站上,他们使用了这样一个事实:从中心到切点的直线之间的点积垂直于切线。然而,我不知道如何将其转化为我的模型。如果我使用matlab的“点”函数,我将如何设置雅可比矩阵?使用matlab内置函数 最简单的方法是按原样定义函数,然后使用fsolve()函数。例如(代码未经测

给定:两个圆的中心和半径

我的问题是,我不知道如何使用数值方法找到一个圆的切线。使用matlab/octave,我会知道如何手工求解,但不知道如何使用matlab/octave


正是这个问题给我带来了困难。即建立方程组。在上面的网站上,他们使用了这样一个事实:从中心到切点的直线之间的点积垂直于切线。然而,我不知道如何将其转化为我的模型。如果我使用matlab的“点”函数,我将如何设置雅可比矩阵?

使用matlab内置函数

最简单的方法是按原样定义函数,然后使用
fsolve()
函数。例如(代码未经测试):

然后执行:

t0 = [0 0 1 1];
solution = fsolve(@cctang,t0);
使用自定义迭代函数

如果你想从头开始构建一切,你可以构建一个自定义的雅可比函数,并将它输入到你在问题中给出的求解函数中。雅可比函数应如下所示:

function  J = myJacobian(t)
    %returns a 4-by-4 matrix
    x1 = [0 0]; r1=4;
    x2 = [1 1]; r2=0.5;

    J = zeros(4,4);

    J(1,:) = [ x2(1)-t(3), x2(2)-t(4), 2*t(3)-x2(1), 2*t(4)-x2(2)];
    %etc...
end
使用符号工具箱

在前面的方法中,许多“艰苦的工作”来自于这样一个事实,即您需要以数字和手动方式计算导数。 使用符号工具箱,您可以以符号方式定义函数,然后使用来计算雅可比矩阵

这些将是自定义数值求解函数的输入。在每次迭代中,您应该用实际的数值替换符号变量(请参阅)


这将使您的代码更加通用,对人为错误的敏感性更低(例如,我在最后一段代码中计算的一个导数中出错的概率是多少?)。

使用MATLAB内置函数

最简单的方法是按原样定义函数,然后使用
fsolve()
函数。例如(代码未经测试):

然后执行:

t0 = [0 0 1 1];
solution = fsolve(@cctang,t0);
使用自定义迭代函数

如果你想从头开始构建一切,你可以构建一个自定义的雅可比函数,并将它输入到你在问题中给出的求解函数中。雅可比函数应如下所示:

function  J = myJacobian(t)
    %returns a 4-by-4 matrix
    x1 = [0 0]; r1=4;
    x2 = [1 1]; r2=0.5;

    J = zeros(4,4);

    J(1,:) = [ x2(1)-t(3), x2(2)-t(4), 2*t(3)-x2(1), 2*t(4)-x2(2)];
    %etc...
end
使用符号工具箱

在前面的方法中,许多“艰苦的工作”来自于这样一个事实,即您需要以数字和手动方式计算导数。 使用符号工具箱,您可以以符号方式定义函数,然后使用来计算雅可比矩阵

这些将是自定义数值求解函数的输入。在每次迭代中,您应该用实际的数值替换符号变量(请参阅)


这将使您的代码更加通用,对人为错误的敏感度降低(例如,我在最后一段代码中计算的一个导数中出错的概率是多少?)

作为Yellow解决方案的替代方案,我想指出,这个问题可以通过更具几何色彩的迭代来解决。此解决方案推广到任何平滑曲线,而不仅仅是圆

让我们把圆心分别称为
A
C[B]
B
,半径分别称为
R[A]
R[B]
。方括号表示下标

您还可以对线端点进行一些初始估计,可能是根据用户选择。调用这些点
P[A][0]
P[B][0]

对于
p[A][i]
p[B][i]
,计算
p[A][i+1]
p[B][i+1]
,如下所示:

  • 通过将
    P[a][i]
    P[B][i]
    投影到圆上,创建一条线
    L[i]
  • Q[A][i]
    成为
    L[i]
    A
    的最近点
  • Q[B][i]
    类似地成为
    L[i]
    B
    的最近点
  • P[A][i+1]
    Q[A][i]
    C[A]
    的投影
  • P[B][i+1]
    Q[B][i]
    C[B]
    的投影
  • 如果
    |P[A][i+1]-Q[A][i]|++P[A][i+1]-Q[A][i]|
    ,那么线段
    P[A][i+1],P[B][i+1]
    就是您的解决方案

  • 作为Yellow解决方案的替代方案,我想指出,这个问题可以通过更具几何色彩的迭代来解决。此解决方案推广到任何平滑曲线,而不仅仅是圆

    让我们把圆心分别称为
    A
    C[B]
    B
    ,半径分别称为
    R[A]
    R[B]
    。方括号表示下标

    您还可以对线端点进行一些初始估计,可能是根据用户选择。调用这些点
    P[A][0]
    P[B][0]

    对于
    p[A][i]
    p[B][i]
    ,计算
    p[A][i+1]
    p[B][i+1]
    ,如下所示:

  • 通过将
    P[a][i]
    P[B][i]
    投影到圆上,创建一条线
    L[i]
  • Q[A][i]
    成为
    L[i]
    A
    的最近点
  • Q[B][i]
    类似地成为
    L[i]
    B
    的最近点
  • P[A][i+1]
    Q[A][i]
    C[A]
    的投影
  • P[B][i+1]
    Q[B][i]
    C[B]
    的投影
  • 如果
    |P[A][i+1]-Q[A][i]|++P[A][i+1]-Q[A][i]|
    ,那么线段
    P[A][i+1],P[B][i+1]
    就是您的解决方案
  • “放气”两个圆,直到其中一个成为点。在通货紧缩期间,o