两参数曲面的相交曲线计算问题
对于两个曲面参数方程:A: \(\)
B: \(\)
相交的曲线C如何求解?能否给出其参数表达式?
例如:
下面两个参数曲面A和B
[[(-30*k1 + 80)*cos(t), (-30*k1 + 90)*sin(t), 1000 - 1000*k1],
[-h22*(-1 + k2)*sqrt(3)/2 + 5*sin(t)*(-8 + k2), (-10*k2 + 70)*cos(t) + 30 - 30*k2, -5*sin(t)*(-8 + k2)*sqrt(3) - h22*(-1 + k2)/2]]
A和B(h22取常量500)的隐式表达为
(10000*y^2)/(9*(2000 + z)^2) + 10000*x^2/(5000 + 3*z)^2 = 1
2500*(sqrt(3)*x - 3*z)^2/(sqrt(3)*z + 7000*sqrt(3) + 3*x)^2 + (100*sqrt(3)*y - 3*sqrt(3)*z - 9*x)^2/(sqrt(3)*z + 6000*sqrt(3) + 3*x)^2 = 1
参数曲面A和B的图像为:
我们令\(x_1=x_2,y_1=y_2,z_1=z_2\),求得待定参数\(k_1,k_2,h_{22}\)
h22 = (30*cos(t)*(cos(t)^2 - cos(t)*sin(t) - 21*sin(t) - 1)*sqrt(3) - 4000*cos(t)^2 + (-1000*sin(t) - 30000)*cos(t) - 21000*sin(t) - 6000)/((600*cos(t) - 600*sin(t))*sqrt(3) + 24*cos(t)^2 + 3*cos(t)*sin(t) - 42),
k1 = (-10*sin(t)^2 - 2*cos(t)*sin(t) + 100*sqrt(3)*cos(t) - 42*sin(t) - 24*cos(t) + 300*sqrt(3) - 8)/(-3*sin(t)^2 + 100*sqrt(3)*cos(t) + 300*sqrt(3) - 9*cos(t) - 3),
k2 = (-48 + 100*(7*cos(t) - 6*sin(t) + 3)*sqrt(3) + 27*cos(t)^2 + 3*(sin(t) - 3)*cos(t))/(-6 + 100*(3 + cos(t))*sqrt(3) + 3*cos(t)^2 - 9*cos(t))
将所求\(k_1,k_2,h_{22}\)代入原曲面参数方程A,B得到相交曲线C的参数方程:
[5000*((3 + cos(t))*sqrt(3) + (3*sin(t)*(cos(t) + sin(t) + 21))/250)*cos(t)/(-6 + 100*(3 + cos(t))*sqrt(3) + 3*cos(t)^2 - 9*cos(t)),
30*(2*cos(t)*sin(t) - cos(t)^2 + 200*sqrt(3)*cos(t) + 42*sin(t) - 3*cos(t) + 600*sqrt(3))*sin(t)/(-6 + 100*(3 + cos(t))*sqrt(3) + 3*cos(t)^2 - 9*cos(t)),
1000*(12 - 7*cos(t)^2 + (2*sin(t) + 15)*cos(t) + 42*sin(t))/(-6 + 100*(3 + cos(t))*sqrt(3) + 3*cos(t)^2 - 9*cos(t))]
相交曲线图像C为
将A,B,C放在同一坐标系得到:
明显C的方程有误,请帮忙看看哪里出了问题??如何求解曲线C的参数方程 貌似应该满足 \(k_1=k_2\) 才是两曲面的交线。 也就是相交曲线满足条件
A: \(\)
理论上我们可以消除掉三个参数,只余下一个 本帖最后由 Jack315 于 2024-7-26 00:17 编辑
设两曲面的参数方程分别为:
\(\begin{array}{c}A:\begin{cases}x=f_1(k,t)\\y=g_1(k,t)\\z=h_1(k,t)\end{cases}&B:\begin{cases}x=f_2(k,t)\\y=g_2(k,t)\\z=h_2(k,t)\end{cases}\end{array}\)
联立方程组:
\(\begin{cases}f_1(k_1,t_1)=f_2(k_2,t_2)\\g_1(k_1,t_1)=g_2(k_2,t_2)\\h_1(k_1,t_1)=h_2(k_2,t_2)\end{cases}\)
解得:
\(\begin{cases}k_1=f(t_2)\\k_2=g(t_2)\\t_1=h(t_2)\end{cases}\)
代回到曲面方程(A 或 B)中,并把 t2 换成 t ,即得到曲线的参数方程。
两个曲面共 4 个参变量:\(k_1,t_1,k_2,t_2\) 。三个方程消除 3 个变量,剩下一个是两曲面交线的参变量。
对于所给两个曲面方程的形式,曲线的参数方程没解出来:L 本帖最后由 Jack315 于 2024-7-25 23:29 编辑
【数值方法】
定义曲面参数方程:
fx1 := (-30 k + 80) Cos
fy1 := (-30 k + 90) Sin
fz1 := 1000 (1 - k)
fx2 := Sqrt/2 h (1 - k) - 5 (8 - k) Sin
fy2 := (70 - 10 k) Cos
fz2 := 5 Sqrt (8 - k) Sin + h/2 (1 - k)z 值相等,求出 k1:
solz = Solve == fz2, k1] // Simplify // Flatten
【输出】{k1 -> 1 + (h (-1 + k2))/2000 + 1/200 Sqrt (-8 + k2) Sin}y 值相等,求出 k2:
soly = Solve[(fy1 /. solz) == (fy2 /. solz), k2] //Simplify // Flatten
【输出】{k2 -> (14000 Cos - 3 Sin (4000 + h + 80 Sqrt Sin))/(2000 Cos - 3 Sin (h + 10 Sqrt Sin))}x 值相等,求出 t1:
solx = Solve[(fx1 /. solz /. soly) == (fx2 /. solz /. soly), t1]
【输出】……CPU 努力运算中(放弃)。这样可以得到四个计算公式:
fx1a = (fx1 /. solz /. soly // Simplify)
fx2a = (fx2 /. solz /. soly // Simplify)
fy = fy1 /. solz /. soly // Simplify
fz = fz1 /. solz /. soly // Simplify给定 h 参数后,就可以逐点计算出交线上点的坐标。参变量为 t2,以 t2 = 0 为例。
求 t1 值(假设 h 取 500):
sol = NSolve[{(fx1a /. {t2 -> 0, h -> 500}) == (fx2a /. {t2 -> 0, h -> 500}), 0 <= t1 <= 2 \}, t1, Reals] // Flatten
【输出】{t1 -> 1.5708, t1 -> 1.58042}求 x 坐标:
Table], {i, Length}]
【输出】{3.06162*10^-15, -0.481021}
Table], {i, Length}]
【输出】{0., -0.481021}求 y 坐标:
Table], {i, Length}]
【输出】{60., 59.9889}求 z 坐标:
Table], {i, Length}]
【输出】{0., -0.277717}对应 t2 = 0,t1=(1.5708, 1.58042),交线上两个点的坐标为:(0, 60, 0), (-0.4810, 59.9889, -0.2777) 。 【两平面相交直线的参数方程】
平面 A:
\(\begin{cases}fx_1(s,t)=-1+2s-t\\fy_1(s,t)=1+s+t\\fz_1(s,t)=2-s+2t\end{cases}\)
fx1 := x01 + s x11 + t x21
fy1 := y01 + s y11 + t y21
fz1 := z01 + s z11 + t z21
pts1 = {x01 -> -1, y01 -> 1, z01 -> 2, x11 -> 2, y11 -> 1, z11 -> -1, x21 -> -1, y21 -> 1, z21 -> 2}平面 B:
\(\begin{cases}fx_2(s,t)=2-2s+t\\fy_2(s,t)=1+s+2t\\fz_2(s,t)=-1+2s-t\end{cases}\)
fx2 := x02 + s x12 + t x22
fy2 := y02 + s y12 + t y22
fz2 := z02 + s z12 + t z22
pts2 = {x02 -> 2, y02 -> 1, z02 -> -1, x12 -> -2, y12 -> 1, z12 -> 2, x22 -> 1, y22 -> 2, z22 -> -1}联立方程求解:
\(\begin{array}{cc}
\begin{cases}fx_1(s_1,t_1)=fx_2(s_2,t_2)\\fy_1(s_1,t_1)=fy_2(s_2,t_2)\\fz_1(s_1,t_1)=fz_2(s_2,t_2)\end{cases}
\rightarrow&
\begin{cases}s_1=1+\frac{5}{3}t_2\\s_2->-2t_2\\t_1=-1-\frac{5}{3}t_2\end{cases}
\end{array}\)
sol = Solve[{fx1 == fx2, fy1 == fy2, fz1 == fz2}, {s1, s2, t1}] /. pts1 /. pts2代入平面 A 中得直线的参数方程:
\(\begin{cases}fx(t)=2+5t\\fy(t)=1\\fz(t)=-1-5t\end{cases}\)
fx1 /. sol /. pts1 /. pts2 // Simplify
fy1 /. sol /. pts1 /. pts2 // Simplify
fz1 /. sol /. pts1 /. pts2 // Simplify可视化验证:
Show[{
ParametricPlot3D[{fx1, fy1, fz1} /. pts1,{s, -0.5, 1.5}, {t, -2, 2}, PlotStyle -> Red],
ParametricPlot3D[{fx2, fy2, fz2} /. pts2,{s, -1, 2.5}, {t, -2, 1}, PlotStyle -> Blue],
ParametricPlot3D[{fx1, fy1, fz1} /. sol /. pts1 /. pts2, {t2, -1.5, 1}]
}]
【接 6 #】
4 个计算公式为:
\(\begin{cases}
f_{x1a}(t_1,t_2,h)=\frac{10\cos{t_1}}{2000\cos{t_2}-3\sin{t_1}(h+10\sqrt{3}\sin{t_2})}\\
f_{x2a}(t_1,t_2,h)=\frac{-2000\cos{t_2}(3\sqrt{3}h+5\sin{t_2})+60\sin{t_1}}{2000\cos{t_2}-3\sin{t_1}(h+10\sqrt{3}\sin{t_2})}\\
f_y(t_1,t_2,h)=\frac{60\cos{t_2}\sin{t_1}(2000-3h+5\sqrt{3}\sin{t_2})}{2000\cos{t_2}-3\sin{t_1}(h+10\sqrt{3}\sin{t_2})}\\
f_z(t_1,t_2,h)=-\frac{2000[\cos{t_2}(3h-5\sqrt{3}\sin{t_2})-3\sin{t_1}(h+10\sqrt{3}\sin)]}{2000\cos{t_2}-3\sin{t_1}(h+10\sqrt{3}\sin{t_2})}\\
\end{cases}\)
数值计算函数:
getPoints := Module[
{fxa, fxb, fy, fz, sol, n, x, y, z, pts},
(*参数方程定义*)
fxa := (10 Cos (3 Sin (h + 10 Sqrt Sin) + 2 Cos (5000 - 9 h + 15 Sqrt Sin)))/(2000 Cos - 3 Sin (h + 10 Sqrt Sin));
fxb := (-2000 Cos (3 Sqrt h + 5 Sin) + 60 Sin (100 Sqrt h + (-1000 + 7 h) Sin))/(2000 Cos - 3 Sin (h + 10 Sqrt Sin));
fy := (60 Cos Sin (2000 - 3 h + 5 Sqrt Sin))/(2000 Cos - 3 Sin (h + 10 Sqrt Sin));
fz := -((2000 (Cos (3 h - 5 Sqrt Sin) - 3 Sin (h + 10 Sqrt Sin)))/(2000 Cos - 3 Sin (h + 10 Sqrt Sin)));
(*给定参数 t20 和 h0,求解参数 t1 。*)
sol = Solve[{fxa == fxb, 0 <= t1 <= 2 \}, t1, Reals] // Flatten;
(*计算曲面交线上点的坐标。*)
n = Length;
If[n > 0,
x = List[]; y = List[]; z = List[];
For[i = 1, i <= n, i++,
AppendTo + fxb) /. sol[]];
AppendTo /. sol[]];
AppendTo /. sol[]]];(*End For*)
pts = Table[{t1 /. sol[], x[], y[], z[]} // N, {i, n}],
pts = {}]; (*End If*)
(*输出计算结果*)
pts
](*End Module*)计算步骤:
1. 给定 h 参数,一个 t2 参数对应相交曲线上 0 个或多个点。
2. 令 \(f_{x1a}\) 和 \(f_{x2a}\) 相等求出 t1
3. 计算 \(f_{x1a}\) 和 \(f_{x2a}\) 的平均值作为 x 坐标(也可以只取其中之一)。
4. 用 \(f_y\) 和 \(f_z\) 分别计算 y、z 坐标。 在 \((0,2\pi)\) 内均匀取 120 个 t2 值:
t2 = Table[(i - 1)/120 2 \, {i, 120}];计算交线上点坐标:
data = Table], 500], {i, Length}];
pts = Table], {j, Length]]}], {i, Length}] // Flatten;
Length
pts = ArrayReshape;画图:
ListPointPlot3D
Show[{ParametricPlot3D[{{fx1, fy1, fz1},
{fx2, fy2, fz2} /. h -> 500}, {k, 0.75, 1.25}, {t, 0, 2 \}],
ListPointPlot3D}]
从图上看,很可能是两个椭圆。
虽然直接求解参数方程有困难,但根据求出的点拟合出参数方程还是有可能的。