我最初的问题是:使用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]
答案 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