| 
注册时间2021-11-19最后登录1970-1-1威望 星金币 枚贡献 分经验 点鲜花 朵魅力 点上传 次下载 次积分9920在线时间 小时 
 | 
 
 发表于 2023-8-11 11:00:12
|
显示全部楼层 
| 继续优化我的代码,更容易读更容易懂,添加注释
 
 复制代码Clear["Global`*"];(*清除所有变量*)
{x1,y1,r1}={-1,0,1}(*上一个圆圆心与半径初始赋值*)
(*子函数,输入参数{x1,y1,r1}表示上一个圆的圆心与坐标,输出结果为下一个圆的圆心与半径{x2,y2,r2}*)
NextCircle[list_]:=Module[{x1=list[[1]],y1=list[[2]],r1=list[[3]],x2,y2,r2,ans,out},
    ans=Solve[{
        (x2-x1)^2+(y2-y1)^2==(r2+r1)^2,(*上一个圆(x1,y1,r1)与下一个圆(x2,y2,r2)外切*)
        (x2-0)^2+(y2-0)^2==(2-r2)^2,(*两个圆内切,圆心(0,0)半径=2*)
        (x2-1)^2+(y2-0)^2==(1+r2)^2,(*两个圆外切,圆心(1,0)半径=1*)
        y2>0&&x2>x1&&r1>r2>0(*限制变量范围*)
    },{x2,y2,r2}]//FullSimplify;
    out={x2,y2,r2}/.ans[[1]](*返回结果,返回圆心与半径*)
]
(*aaa用来保存圆心坐标、半径的数组*)
aaa={{x1,y1,r1}};(*第一个圆心、半径搞进来*)
Do[aa=NextCircle[{x1,y1,r1}];(*根据上一个圆(x1,y1,r1)找到下一个圆(x2,y2,r2)*)
    aaa=Append[aaa,aa];(*把找到的圆(x2,y2,r2)保存到数组里面*)
    {x1,y1,r1}=aa,(*把找到的圆的数据赋值给下一个圆的输入数据*)
    {k,1,20}
]
(*圆心x通项公式,圆心y通项公式,半径通项公式*)
bbb=Transpose[aaa](*矩阵转置过来,对行找通项公式*)
ccc=FindSequenceFunction[#,n]&/@bbb(*对每一行找通项公式*)
ddd=ccc/.n->n+1//Simplify(*置换一下,数组下标从零开始*)
 得到的圆心与半径数据
 {{-1, 0, 1, 16/11, 5/3, 16/9, 35/19, 32/17, 21/11, 160/83, 33/17, 80/
 41, 143/73, 112/57, 65/33, 448/227, 85/43, 192/97, 323/163, 240/121,
 133/67},
 
 {0, 4/3, 4/3, 12/11, 8/9, 20/27, 12/19, 28/51, 16/33, 36/
 83, 20/51, 44/123, 24/73, 52/171, 28/99, 60/227, 32/129, 68/291, 36/
 163, 76/363, 40/201},
 
 {1, 2/3, 1/3, 2/11, 1/9, 2/27, 1/19, 2/51, 1/
 33, 2/83, 1/51, 2/123, 1/73, 2/171, 1/99, 2/227, 1/129, 2/291, 1/
 163, 2/363, 1/201}}
 
 得到的通项公式(下标从零开始)
 \[\left\{\frac{2 \left(n^2-1\right)}{n^2+2},\frac{4 n}{n^2+2},\frac{2}{n^2+2}\right\}\]
 | 
 |