公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+1 投票
2.2k 浏览

我想用椭圆把两个向量罩住,咋个弄呢?
本来两个向量应该是椭圆的长半轴和短半轴(椭圆的两个顶点应该在向量端点上)...

A = {{1, 2}, {0, 2}}
{U, S, V} = SingularValueDecomposition[A]
style[opts__, x_Ellipsoid] :=
 Graphics[x] /. Line[y_] :> {opts, Polygon[y]} // First
sigma1u1 = S[[1, 1]]*U[[All, 1]];
sigma2u2 = S[[2, 2]]*U[[All, 2]];
ellips = Ellipsoid[{0, 0}, {sigma1u1, sigma2u2}];
Graphics[{Black, FaceForm[Opacity@.2], ellips,
  Arrow[{{0, 0}, sigma1u1}], Arrow[{{0, 0}, sigma2u2}]}, Axes -> True]
分类:绘图 | 用户: mma-2-2-2 (1.3k 分)
修改于 用户:苹果
说明你应该好好查查Ellipsoid怎么画椭圆的呀!
我再检查一下,还有就是下面这个提问的排版方式如何插入了三个可以活动的代码框,用的排版里面的哪个工具呢?http://mmaqa.com/index.php/261/colorfunction%E7%9A%84%E7%BA%AF%E5%87%BD%E6%95%B0%E5%88%B0%E5%BA%95%E6%80%8E%E4%B9%88%E5%86%99%E7%9A%84%EF%BC%9F
我知道了,使用<>添加代码,当代码长度很长时,会自动添加拖动按钮,谢谢苹果

1个回答

+7 投票
 
已采纳

这个问题其实挺有意思的。所以我修改了问题名。

Ellipsoid毫无疑问可以绘画倾斜的椭圆。但是帮助文档里几乎没有倾斜椭圆的例子(只有1个,还看不懂)。

再查帮助文档Ellipsoid,发现“更多信息”中对Ellipsoid的两种语法都做了解释:

第一种显然就是正的椭圆了。第二种是什么东西?所以先做个试验,为简单,p取为0,并给∑取一个对称矩阵。

{x, y}.Inverse[{{a, b}, {b, d}}].{x, y} <= 1 // Expand

所以只要a,b,d的值取得好,那么我们就可以画出任意倾斜的椭圆。问题是,已知长短轴,怎么计算a,b,d。

倾斜椭圆可以看成是正椭圆的旋转,所以已知长短轴可以写出另外一个表达式。

x^2/c1^2 + y^2/c2^2 /. {x -> x Cos[θ] - y Sin[θ], 
    y -> y Cos[θ] + x Sin[θ]} // Expand // Collect[#, {x, y}] &

分别令x^2,y^2和xy之前的系数与前一个表达式的系数相等,就可以解出来合适的a,b,d了。

getCoeff[vec1_, vec2_] := Module[{c1, c2, θ},
  c1 = Norm@N@vec1; c2 = Norm@N@vec2; θ = ArcTan @@ N[vec1];
  Off[Solve::ratnz];
  First@Solve[{d/(-b^2 + a d) == 
      Cos[θ]^2/c1^2 + Sin[θ]^2/c2^2, (
      2 b)/(-b^2 + a d) == -((2 Cos[θ] Sin[θ])/c1^2) + (2 Cos[θ] Sin[θ])/c2^2, 
     a/(-b^2 + a d) == Cos[θ]^2/c2^2 + Sin[θ]^2/c1^2}, {a, b, d}]
  ]

然后就可以画图了。

mat = {{a, b}, {b, d}} /. getCoeff[sigma1u1, sigma2u2];
Graphics[{Black, FaceForm[Opacity@.2], Ellipsoid[{0, 0}, mat], 
  Arrow[{{0, 0}, sigma1u1}], Arrow[{{0, 0}, sigma2u2}]}, Axes -> True]

 

最后可以重载Ellipsod函数,使得我们可以直接输入长短轴的矢量进行画图,而不是我不懂的∑函数。

Clear["Global`*"]

(*重载Ellipsoid函数,增加一个画椭圆的语法,并修改自动配色*)

ClearAttributes[Ellipsoid, Protected];
Ellipsoid[r_, vec1_, vec2_] := Module[{c1, c2, mat, θ, a, b, d},
   Ellipsoid::nnarg = "请输入正交的椭圆长短轴";
   
   If[Chop[vec1.vec2] != 0, Message[Ellipsoid::nnarg]];
   
   c1 = Norm@N@vec1; c2 = Norm@N@vec2; \[Theta] = ArcTan @@ N[vec1];
   mat = {{a, b}, {b, d}} /. 
     First@NSolve[{d/(-b^2 + a d) == Cos[θ]^2/c1^2 + Sin[θ]^2/c2^2,
       (2 b)/(-b^2 + a d) == 
          -((2 Cos[θ] Sin[θ])/c1^2) + (2 Cos[θ] Sin[θ])/c2^2, 
       a/(-b^2 + a d) == Cos[θ]^2/c2^2 + Sin[θ]^2/c1^2}, {a, b, d}];
   Ellipsoid[r, mat]
   ];
SyntaxInformation[Ellipsoid] = {"ArgumentsPattern" -> {__}};
SetAttributes[Ellipsoid, Protected];

(*生成相互垂直的两个矢量作为长短轴,以及椭圆中心点*)
{r1, r2} = RandomReal[{0, 10}, 2];
θ = RandomReal[{0, 2 Pi}];
vec1 = r1 {Cos[θ], Sin[θ]}; vec2 = r2 {Cos[θ + Pi/2], Sin[θ + Pi/2]};
p = RandomReal[{-10, 10}, 2];
(*画图*)
Graphics[{Black, FaceForm[Opacity@.2], Ellipsoid[p, vec1, vec2],
  Arrow[{p, vec1 + p}], Arrow[{p, vec2 + p}]}, Axes -> True]

 

用户: 苹果 (2.2k 分)
修改于 用户:苹果
其实我觉得。。为什么不用5点确定一个椭圆曲线呢?
因为现状是已知椭圆长短轴矢量并且希望用ellipsoid画图.由于数学不好所以看不懂ellipsoid的那个矩阵含义是什么,所以只能转换为普通人能看懂的写法.
...