Maple:如何插入命令强制我的代码选择随机整数值来查找我的值?

时间:2016-01-30 15:08:28

标签: algorithm maple

我最初的问题是:使用Newton-Raphson算法的几个变量版本来查找2个圆圈的所有4个(实数和复数)交点                           2 2
                   (x-7)+(y-2)= 100  和                            2 2
                   (x-11)+(y-5)= 75  精确到25位数。将这两个圆圈绘制成两种颜色,显示它们的2个实际交点。

我找到的代码在找到这两个圆圈交叉点的实际值时做得很好。但是,我是两个圆圈的图像,以确定我的猜测值。现在对于复杂的交叉点,我必须简单猜测并检查可能的解决方案。然而,这很愚蠢。

我想知道怎么做是创建一个产生一对复数的循环,在下面运行算法/ for循环,如果它与之前的解决方案匹配,则再次启动循环。

f := (x-7)^2+(y-2)^2-100;
                          2          2      
                   (x - 7)  + (y - 2)  - 100
g := (x-11)^2+(y-5)^2-75;
                           2          2     
                   (x - 11)  + (y - 5)  - 75
with(plots);
plotf := implicitplot(f, x = -25 .. 25, y = -25 .. 25, color = blue, thickness = 1);
plotg := implicitplot(g, x = -25 .. 25, y = -25 .. 25, color = red, thickness = 1);
display(plotg, plotf);

x[0] := 5.0;
                              5.0
y[0] := 11.0;
                              11.0
X[0] := [x[0], y[0]];
                          [5.0, 11.0]
with(linalg);
G := unapply(convert(evalm((Vector(2, {(1) = x, (2) = y}))-1/jacobian([f, g], [x, y]) . (Vector(2, {(1) = f, (2) = g}))), list), x, y);
                   [        /       2          2      \
                   [(y - 5) \(x - 7)  + (y - 2)  - 100/
         (x, y) -> [-----------------------------------
                   [        2 (3 x - 4 y - 13)         

                      /        2          2     \      
              (y - 2) \(x - 11)  + (y - 5)  - 75/      
            - ----------------------------------- + x, 
                      2 (3 x - 4 y - 13)               
                    /       2          2      \
           (x - 11) \(x - 7)  + (y - 2)  - 100/
         - ------------------------------------
                    2 (3 x - 4 y - 13)         

                      /        2          2     \    ]
              (x - 7) \(x - 11)  + (y - 5)  - 75/    ]
            + ----------------------------------- + y]
                      2 (3 x - 4 y - 13)             ]
for K to 10 while `and`(evalf(abs(X[K-1][1]-X[K-2][1]), 25) <> 0, evalf(abs(X[K-1][2]-X[K-2][2]), 25) <> 0) do X[K] := evalf(G(X[K-1][1], X[K-1][2]), 25) end do;
    [5.749999999999999999999999, 12.00000000000000000000000]
    [5.803571428571428571428572, 11.92857142857142857142857]
    [5.803847569955817378497791, 11.92820324005891016200295]
    [5.803847577293368114236941, 11.92820323027550918101742]
    [5.803847577293368119417657, 11.92820323027550917410978]
    [5.803847577293368119417661, 11.92820323027550917410978]
X[0] := [17, -2];
                            [17, -2]
for K to 20 while `and`(evalf(abs(X[K-1][1]-X[K-2][1]), 25) <> 0, evalf(abs(X[K-1][2]-X[K-2][2]), 25) <> 0) do X[K] := evalf(G(X[K-1][1], X[K-1][2]), 25) end do;
   [16.21739130434782608695652, -1.956521739130434782608696]
   [16.19619565217391304347826, -1.928260869565217391304346]
   [16.19615242288645448220352, -1.928203230515272642938024]
   [16.19615242270663188058545, -1.928203230275509174113935]
   [16.19615242270663188058234, -1.928203230275509174109784]
   [16.19615242270663188058234, -1.928203230275509174109785]
X__0 := [170.0-1.*I, 270.0*I];
                    [170.0 - 1. I, 270.0 I]
for K to 20 while `and`(evalf(abs(X[K-1][1]-X[K-2][1]), 25) <> 0, evalf(abs(X[K-1][2]-X[K-2][2]), 25) <> 0) do X[K] := evalf(G(X[K-1][1], X[K-1][2]), 25) end do;
   [16.21739130434782608695652, -1.956521739130434782608696]
   [16.19619565217391304347826, -1.928260869565217391304346]
   [16.19615242288645448220352, -1.928203230515272642938024]
   [16.19615242270663188058545, -1.928203230275509174113935]
   [16.19615242270663188058234, -1.928203230275509174109784]
   [16.19615242270663188058234, -1.928203230275509174109785]

1 个答案:

答案 0 :(得分:0)

请参阅我之后的回复related question

在那个答案中,我创建了一个为给定范围生成随机浮点数的过程。我不确定为什么你可能会坚持使用整数起点,但你可以在我的答案中轻松修改代码来代替。你可以简单地定义这样的程序fgen

fgen := proc(a::numeric,b::numeric,i::nonnegint:=1)
  seq(RandomTools:-Generate(integer('range'=a..b)),
      ii=1..i);
end proc:

fgen(-100, 100); # Usage example, a random point

                           15

fgen(-100, 100, 8);

           81, 64, -7, 91, -87, -81, -66, 19