Aritmetik-geometrik u(k) = (900-3k)rk-1 dizisi verilsin.
s(n) = Σk = 1 ... nu(k) olsun.
s(5000) = -600.000.000.000 için r değerini bulunuz.
Cevabınızı 12 ondalık basamağa göre yuvarlayınız.
Cevap: 1,002322108633
Python:
def s(r):
return sum((900-3*k)*r**(k-1) for k in range(1, 5001))
for i in range(10):
r = 1.002322108632 + i * 10 ** -13
print(format(r, '.13f'), format(s(r), '13f'))
C++:#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <memory.h>
#include <string.h>
#include <time.h>
struct timer
{
clock_t t;
timer() { t = clock(); }
~timer() { printf("runtime %.3f secs\n", getTime()); }
double getTime() { return ((double)clock()-(double)t)/(double)CLOCKS_PER_SEC; }
};
void fx()
{
double N=200000000000, r=1.01, pr, diff=(r-1)/2;
while (pr=r, diff != 0)
{
double rx=1, rt=0;
int i=0;
while (++i<=5000)
rt-=(300-i)*rx, rx=rx*r;
if (rt>N)
r-=diff, diff=(pr-r)/2;
else if (rt<N)
r+=diff, diff=(r-pr)/2;
}
printf("found=%.12f\n",r);
}
int main(int ac, char** av)
{
timer t;
fx();
return 0;
}
Ruby:def u(r, k)
(900-3*k)*(r**(k-1))
end
def s(r, n)
sum = 0
(1..n).each {|k| sum += u(r, k)}
sum
end
r = 1
delta = 0.1
max = -6*10**11
precision = 12
while precision > 0 do
r += delta
res = s(r, 5000)
p r
if res < max then
r -= delta
delta /= 10
precision -= 1
end
end
Perl:sub U
{
my $r = $_[0];
my $n = 5000;
my $retU = 0;
for $k ( 1 .. $n ) {$retU +=(900-(3*$k))*($r**($k-1))}
return $retU;
}
$goal = -600000000000;
$r = 1;
$inc = .01;
$side = "-";
while (abs($inc)> 0.0000000000001)
{
$ans = U $r;
if (($ans < $goal) && ($side eq "-"))
{
$inc = - $inc/10;
$side = "+";
}
if (($ans > $goal) && ($side eq "+"))
{
$inc = - $inc/10;
$side = "-";
}
$r += $inc;
}
print $r\n;