Resistor mesh: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) (→{{header|Raku}}: extensive refactor) |
|||
Line 1,927: | Line 1,927: | ||
=={{header|Raku}}== |
=={{header|Raku}}== |
||
(formerly Perl 6) |
(formerly Perl 6) |
||
{{trans| |
{{trans|C}} |
||
<lang perl6>my $ |
<lang perl6>my $*TOLERANCE = 1e-12; |
||
sub set-boundary(@mesh,@p1,@p2) { |
|||
my @fixed; |
|||
⚫ | |||
⚫ | |||
sub allocmesh ($w, $h) { |
|||
gather for ^$h { |
|||
take [0 xx $w]; |
|||
} |
|||
} |
} |
||
sub |
sub solve(@p1, @p2, Int \w, Int \h) { |
||
@ |
my @d = [0 xx w] xx h; |
||
@ |
my @V = [0 xx w] xx h; |
||
⚫ | |||
} |
|||
set-boundary(@fixed,@p1,@p2); |
|||
loop { |
|||
sub force-v(@v) { |
|||
set-boundary(@V,@p1,@p2); |
|||
⚫ | |||
my $diff = 0; |
|||
⚫ | |||
} |
|||
⚫ | |||
⚫ | |||
sub calc_diff(@v, @d, Int $w, Int $h) { |
|||
$diff += v × v unless @fixed[i;j]; |
|||
} |
|||
⚫ | |||
⚫ | |||
my $v = [+] @neighbors; |
|||
⚫ | |||
$total += $v * $v unless @fixed[$i][$j]; |
|||
} |
|||
return $total; |
|||
} |
|||
sub iter(@v, Int $w, Int $h) { |
|||
my @d = allocmesh($w, $h); |
|||
⚫ | |||
⚫ | |||
for (flat ^h X ^w) -> \i, \j { |
|||
@V[i;j] -= @d[i;j]; |
|||
$diff = calc_diff(@v, @d, $w, $h); |
|||
⚫ | |||
@v[$i][$j] -= @d[$i][$j]; |
|||
} |
} |
||
} |
} |
||
my @current; |
|||
for (flat ^$h X ^$w) -> $i, $j { |
|||
for (flat ^h X ^w) -> \i, \j { |
|||
@current[ @fixed[i;j]+1 ] += @d[i;j] × (?i + ?j + (i < h-1) + (j < w-1) ); |
|||
} |
} |
||
(@current[2] - @current[0]) / 2 |
|||
⚫ | |||
} |
} |
||
my @mesh = allocmesh($S, $S); |
|||
@fixed = allocmesh($S, $S); |
|||
force-fixed(@fixed); |
|||
say 2 / |
say 2 / solve (1,1), (6,7), 10, 10; |
||
</lang> |
|||
{{out}} |
{{out}} |
||
<pre>1.60899124172989</pre> |
<pre>1.60899124172989</pre> |