アットウィキロゴ

1

1.Newton–@‚Ì
                          f(x), df(x)
‚ÌŠÖŒW‚ðŽ¦‚·Ž®‚𓱂¯D
restart;
y-f(x1) = (df(x1))(x-x1);
                   y - f(x1) = df(x1)(x - x1)
y = (df(x1))(x-x1)+f(x1);
                   y = df(x1)(x - x1) + f(x1)
y=0;
df(x1)(x-x1)+f(x1)=0;
df(x1)(x-x1)=-f(x1);
x-x1=-f(x1)/df(x1);
x=-f(x1)/df(x1)+x1;
                             y = 0
                   df(x1)(x - x1) + f(x1) = 0
                    df(x1)(x - x1) = -f(x1)
                                  f(x1)
                       x - x1 = - ------
                                  df(x1)
                             f(x1)      
                       x = - ------ + x1
                             df(x1)    
“ñ•ª–@Eƒjƒ…[ƒgƒ“–@
restart;
> Digits := 10; f := unapply(exp(-x)-2*exp(-2*x), x); plot(f(x), x = -1 .. 2);
x -> exp(-x) - 2 exp(-2 x)

“ñ•ª–@
x1:=-1.0: x2:=2.0:
f1:=f(x1): f2:=f(x2):
epsilon:=0.001: delta:=0.001:
for i from 1 to 100 do
  x3:=(x1+x2)/2;
  f3:=f(x3);
  if (evalf(f1*f3)>=0.0) then
    f1:=f3;
    x1:=x3;
  else
    f2:=f3;
    x2:=x3;
  end if;
  printf("%10.5f, %10.5f, %10.5f, %10.5f\n",
          x1, x2, f1, f2);
  if (abs(x2-x1)<delta) then
    break;
  end if;
  if (abs(f2-f1)<epsilon) then
    break;
  end if;
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x3, f(x3));
   0.50000,    2.00000,   -0.12923,    0.09870
   0.50000,    1.25000,   -0.12923,    0.12233
   0.50000,    0.87500,   -0.12923,    0.06931
   0.68750,    0.87500,   -0.00285,    0.06931
   0.68750,    0.78125,   -0.00285,    0.03861
   0.68750,    0.73438,   -0.00285,    0.01938
   0.68750,    0.71094,   -0.00285,    0.00866
   0.68750,    0.69922,   -0.00285,    0.00301
   0.68750,    0.69336,   -0.00285,    0.00011
   0.69043,    0.69336,   -0.00136,    0.00011
   0.69189,    0.69336,   -0.00063,    0.00011
11回目, x = 0.69189, f(x) = -0.00063
Newton–@
> x4 := -1.0; df := unapply(diff(f(x), x), x); epsilon := 0.1e-2; delta := 0.1e-2; for i to 100 do x5 := x4-f(x4)/df(x4); printf("%10.5f,~%10.5f\n", x5, f(x5)); if abs(x5-x4) < delta then break end if; if abs(f(x5)-f(x4)) < epsilon then break end if; x4 := x5 end do; printf("%d&aring;›ž&ccedil;›&reg;,~x~=~%.5f,~f(x)~=~%.5f\n", i, x4, f(x4));
x -> -exp(-x) + 4 exp(-2 x)
  -0.55064,   -4.28169
  -0.13485,   -1.47479
   0.22538,   -0.47607
   0.49737,   -0.13151
   0.64833,   -0.02397
   0.69032,   -0.00142
   0.69314,   -0.00001
   0.69315,    0.00000
8&aring;›ž&ccedil;›&reg;, x = 0.69314, f(x) = -0.00001
abs‚͐â‘Î’l
>
>

3(2004Šú––)

3(a)
restart;
with(plots): with(plottools):
Digits:=10:
f:=unapply(exp(-x)-x^2,x);
plot(f(x),x=-1..1);
                2
x -> exp(-x) - x

x1:=-1.0: x2:=1.0:
f1:=f(x1): f2:=f(x2):
epsilon:=0.001: delta:=0.001:
for i from 1 to 100 do
  x3:=(x1+x2)/2;
  f3:=f(x3);
  if (evalf(f1*f3)>=0.00) then
    f1:=f3;
    x1:=x3;
  else
    f2:=f3;
    x2:=x3;
  end if;
  printf("%10.5f, %10.5f, %10.5f, %10.5f\n",
          x1, x2, f1, f2);
  if (abs(x2-x1)<delta) then
    break;
  end if;
  if (abs(f2-f1)<epsilon) then
    break;
  end if;
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x3, f(x3));
   0.00000,    1.00000,    1.00000,   -0.63212
   0.50000,    1.00000,    0.35653,   -0.63212
   0.50000,    0.75000,    0.35653,   -0.09013
   0.62500,    0.75000,    0.14464,   -0.09013
   0.68750,    0.75000,    0.03018,   -0.09013
   0.68750,    0.71875,    0.03018,   -0.02924
   0.70312,    0.71875,    0.00065,   -0.02924
   0.70312,    0.71094,    0.00065,   -0.01425
   0.70312,    0.70703,    0.00065,   -0.00679
   0.70312,    0.70508,    0.00065,   -0.00307
   0.70312,    0.70410,    0.00065,   -0.00121
11回目, x = 0.70410, f(x) = -0.00121
x4:=-1.0:
df:=unapply(diff(f(x),x),x);
epsilon:=0.001: delta:=0.001:
for i from 1 to 100 do
  x5:=x4-f(x4)/df(x4);
  printf("%10.5f, %10.5f\n", x5, f(x5));
  if (abs(x5-x4)<delta) then
    break;
  end if;
  if (abs(f(x5)-f(x4))<epsilon) then
    break;
  end if;
  x4:=x5;
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x4, f(x4));
x -> -exp(-x) - 2 x
   1.39221,   -1.68973
   0.83509,   -0.26353
   0.70983,   -0.01214
   0.70348,   -0.00003
   0.70347,   -0.00000
5回目, x = 0.70348, f(x) = -0.00003

3(b)
二分法
x1:=-1.0: x2:=1.0:
f1:=f(x1): f2:=f(x2):
x_f:=0.7034674225;
lst1:=[]:
for i from 1 to 100 do
  x3:=(x1+x2)/2;
  f3:=f(x3);
  if (evalf(f1*f3)>=0.00) then
    f1:=f3;
    x1:=x3;
  else
    f2:=f3;
    x2:=x3;
  end if;
  lst1:=[op(lst1), log(abs(x_f-x3))];
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x3, f(x3));
                          0.7034674225
101回目, x = 0.70347, f(x) = 0.00000
Newton法
x4:=-1.0:
df:=unapply(diff(f(x),x),x);
x_f:=0.7034674225;
lst2:=[]:
for i from 1 to 100 do
  x5:=x4-f(x4)/df(x4);
  lst2:=[op(lst2), log(abs(x_f-x5))];
  x4:=x5;
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x4, f(x4));
x -> -exp(-x) - 2 x
                          0.7034674225
101回目, x = 0.70347, f(x) = 0.00000
l1:=listplot(lst1,linestyle=solid,legend="二分法""):
l2:=listplot(lst2,linestyle=dashdot,legend="Newton法""):
display([l1,l2]);



>

4(2008”N“x)
restart;
Digits:=10:
f:=unapply(x^4-x-0.12,x);
plot(f(x),x=0..2);
      4          
x -> x  - x - 0.12

x1:=0.0: x2:=2.0:
f1:=f(x1): f2:=f(x2):
epsilon:=1.0*10^(-8): delta:=1.0*10^(-8):
for i from 1 to 1000 do
  x3:=(x1+x2)/2;
  f3:=f(x3);
  if (evalf(f1*f3)>=0.00) then
    f1:=f3;
    x1:=x3;
  else
    f2:=f3;
    x2:=x3;
  end if;
  if (abs(x2-x1)<delta) then
    break;
  end if;
  if (abs(f2-f1)<epsilon) then
    break;
  end if;
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x3, f(x3));
28回目, x = 1.03717, f(x) = 0.00000
6(Š„ü–@)
restart;
Digits:=10:
func:=x->x^2-4*x+1;
x1:=0: x2:=2:
f1:=func(x1): f2:=func(x2):
plot({(z-x1)*(f1-f2)/(x1-x2)+f1,func(z)},z=0..2);
x_f:=fsolve(func(x)=0,x)[1];
      2          
x -> x  - 4 x + 1

                          0.2679491924
with(plots): with(plottools):
f:=func:
N:=40:
割線法
x1:=0: x2:=2:
f1:=f(x1): f2:=f(x2):
lst1:=[]:
for i from 1 to N do
  y1:=((f2-f1)/(x2-x1))*(x-x1)+f1:
  x3:=fsolve(y1=0,x);
  f3:=f(x3);
  if (evalf(f1*f3)>=0.00) then
    f1:=f3;
    x1:=x3;
  else
    f2:=f3;
    x2:=x3;
  end if;
  lst1:=[op(lst1), log(abs(x_f-x3))];
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x3, f(x3));
41回目, x = 0.26795, f(x) = 0.00000
二分法
x1:=0.0: x2:=2.0:
f1:=f(x1): f2:=f(x2):
lst2:=[]:
for i from 1 to N do
  x3:=(x1+x2)/2;
  f3:=f(x3);
  if (evalf(f1*f3)>=0.00) then
    f1:=f3;
    x1:=x3;
  else
    f2:=f3;
    x2:=x3;
  end if;
  lst2:=[op(lst2), log(abs(x_f-x3))];
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x3, f(x3));
41回目, x = 0.26795, f(x) = -0.00000
Newton法
x4:=0.0:
df:=unapply(diff(f(x),x),x):
lst3:=[]:
for i from 1 to N do
  x5:=x4-f(x4)/df(x4);
  lst3:=[op(lst3), log(abs(x_f-x5))];
  x4:=x5;
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x4, f(x4));
41回目, x = 0.26795, f(x) = 0.00000
l1:=listplot(lst1,linestyle=solid,legend="Š„ü–@"):
l2:=listplot(lst2,linestyle=dashdot,legend="“ñ•ª–@"):
l3:=listplot(lst3,linestyle=spacedash,legend="Newton"):
display([l1,l2,l3]);

7(2009”N“x)
restart;
Digits:=10:
with(plots): with(plottools):
f:=unapply(cos(x)-x^2,x);
x_f:=fsolve(f(x)=0,x);
N:=50:
plot(f(x),x=0..1);
                                         2
                     f := x -> cos(x) - x
                      x_f := 0.8241323123

二分法
x1:=0.0: x2:=1.0:
f1:=f(x1): f2:=f(x2):
lst1:=[]:
for i from 1 to N do
  x3:=(x1+x2)/2;
  f3:=f(x3);
  if (evalf(f1*f3)>=0.00) then
    f1:=f3;
    x1:=x3;
  else
    f2:=f3;
    x2:=x3;
  end if;
  lst1:=[op(lst1), log(abs(x_f-x3))];
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x3, f(x3));
51回目, x = 0.82413, f(x) = -0.00000
割線法
x1:=0.0: x2:=1.0:
f1:=f(x1): f2:=f(x2):
lst2:=[]:
for i from 1 to N do
  y1:=((f2-f1)/(x2-x1))*(x-x1)+f1:
  x3:=fsolve(y1=0,x);
  f3:=f(x3);
  if (evalf(f1*f3)>=0.00) then
    f1:=f3;
    x1:=x3;
  else
    f2:=f3;
    x2:=x3;
  end if;
  lst2:=[op(lst2), log(abs(x_f-x3))];
end do:
printf("%d回目, x = %.5f, f(x) = %.5f\n", i, x3, f(x3));
51回目, x = 0.82413, f(x) = -0.00000
l1:=listplot(lst1,linestyle=solid,legend="“ñ•ª–@"):
l2:=listplot(lst2,linestyle=dashdot,legend="Š„ü–@"):
display([l1,l2]);

8(2010”N“x)
restart;
Digits:=10:
f:=unapply(x^3-3*x+3,x);
plot(f(x),x=-5..5);

      3          
x -> x  - 3 x + 3

x1:=-3;
df:=unapply(diff(f(x),x),x);
epsilon:=0.001: delta:=0.001:
for i from 1 to 100 do
  x2:=x1-f(x1)/df(x1);
  printf("%10.5f, %10.5f\n", x2, f(x2));
  if (abs(x2-x1)<delta) then
    break;
  end if;
  if (abs(f(x2)-f(x1))<epsilon) then
    break;
  end if;
  x1:=x2;
end do:
printf("%d‰ñ–Ú, x = %.5f, f(x) = %.5f\n", i, x1, f(x1));

                               -3
        2    
x -> 3 x  - 3
  -2.37500,   -3.27148
  -2.14001,   -0.38046
  -2.10458,   -0.00801
  -2.10380,   -0.00000
4‰ñ–Ú, x = -2.10458, f(x) = -0.00801
x3:=2;
df:=unapply(diff(f(x),x),x);
epsilon:=0.001: delta:=0.001:
for i from 1 to 100 do
  x4:=x3-f(x3)/df(x3);
  printf("%10.5f, %10.5f\n", x3, f(x3));
  if (abs(x4-x3)<delta) then
    break;
  end if;
  if (abs(f(x4)-f(x3))<epsilon) then
    break;
  end if;
  x3:=x4;
end do:
printf("%d‰ñ–Ú, x = %.5f, f(x) = %.5f\n", i, x3, f(x3));
                               2
        2    
x -> 3 x  - 3
   2.00000,    5.00000
   1.44444,    1.68038
   0.92887,    1.01482
   3.39447,   31.92927
   2.38301,    9.38346
   1.71449,    2.89625
   1.21672,    1.15109
   0.41805,    1.81891
   1.15275,    1.07357
   0.06453,    2.80668
   1.00400,    1.00005
-40.56380, -66619.86560
-27.05959, -19729.42266
‰Šú’l‚ðx=-3‚Æ‚µ‚½ê‡‚Í4‰ñ–Ú‚Å‰ð‚ªo‚Ü‚µ‚½‚ª‰Šú’l‚ðx=2‚Æ‚µ‚½ê‡‚ÍŒvŽZŒ‹‰Ê‚ªo‚Ü‚¹‚ñ‚Å‚µ‚½B
>
最終更新:2013年01月09日 18:50