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