23
Verkefni I Guðjón Henning Hilmarsson, Hulda Jónasdóttir og Jóhanna Björk Pálsdóttir Töluleg greining (STÆ405G) Háskóli Íslands 7. september 2012

Verkefni I - University of Iceland · 2013. 12. 10. · Verkefni I Guðjón Henning Hilmarsson, Hulda Jónasdóttir og Jóhanna Björk Pálsdóttir Töluleg greining (STÆ405G) Háskóli

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

  • Verkefni I

    Guðjón Henning Hilmarsson, Hulda Jónasdóttir ogJóhanna Björk Pálsdóttir

    Töluleg greining (STÆ405G)Háskóli Íslands

    7. september 2012

  • Efnisyfirlit1 Núllstöðvar 2

    1.1 Aðferð Newtons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 Helmingunaraðferð og aðferð Newtons sameinaðar . . . . . . . . . . 6

    2 LU-þáttun 92.1 LU-þáttun . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2 For- og endurinnsetning . . . . . . . . . . . . . . . . . . . . . . . . . 142.3 Lausn á línulegu jöfnuhneppi . . . . . . . . . . . . . . . . . . . . . . 162.4 Viðbót fyrir bónusstig . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    1

  • 1 Núllstöðvar

    1.1 Aðferð Newtonsa) Forritið er byggt upp þannig að það leitar að núllstöð fallsins f, með aðferð Newt-ons. Forritið tekur inn fallið f, afleiðu fallsins, df, upphafságiskun á núllstöðinni x0,skekkjumörkin � og hámarksfjölda ítrana Nmax. Forritið keyrir á meðan | f(x)df(x) | ≥ �.Hins vegar stoppar það ef | f(x)

    df(x)| < � eða ef fjöldi ítrana hefur verið náð. Forritið skil-

    ar síðan nálgunargildinu á núllstöð fallsins. Sjá má nánar um virkni forritsins hér aðneðan.

    % Töluleg greining, vor 2012: Verkefni I, hluti 1.1.% Höfundar: Guðjón Henning Hilmarsson, Hulda Jónasdóttir og% Jóhanna Björk Pálsdóttir% Dags: 10.02.2012

    function newton(f,df,x0,epsilon,N_max)%Forritið leitar að núllstöð fallsins f með aðferð Newtons,%upphafságiskunin er x, hámarksskekkjan er epsilon og%hámarksfjöldi ítranna er N_max

    %Skilgreinum breyturx=x0;mis=f(x)/df(x);N=0;

    %Prentum hausinn á töflunni%Skýrum a=(x_(n+1)-x_n)/(x_n-x_(n-1))^2 og%b=(x_(n+1)-x_n)/(x_n-x_(n-1)) svo taflan sé skiljanlegri í keyrslufprintf('\t n\t x_n\t\t x_(n+1)-x_n\t a\t \t \t \t b\n')%Búum til while lykkju sem framkvæmir Newton aðferðinawhile(abs(mis)>=epsilon)

    %Ef notandinn giskar á færri ítrekanir en þarfif N>=N_max

    disp('Hámarksfjöldi ítrana er náð')break

    endx=x-mis;mis=f(x)/df(x);N=N+1;%Tökum fyrir sértilfellið N=1 því þá getum við ekki reiknað%ferningssamleitnina og prentum því einungis fyrstu 3 breyturnar%í töflunni. Annars prentum við allar fjórar breyturnar.if N==1

    fprintf('%7.0f\t %+7.5f\t %+7.5f\n', N, x, mis)else

    fer2=mis/(mis_gamalt^2);fer=mis/(mis_gamalt);fprintf('%7.0d\t %+7.5f\t %+7.5f\t %+7.3f\t \t %+7.5f\n'...

    , N, x, mis, fer2, fer)

    2

  • endmis_gamalt=mis;

    end%Athugum hvort gefinni samleitni hafi verið náðif (abs(mis)> f=@(x)log(x);>> df=@(x)1/x;>> newton(f,df,2,1e-10,25)

    n x_n x_(n+1)-x_n a b1 +0.61371 -0.299642 +0.91334 -0.08279 -0.922 +0.276303 +0.99613 -0.00386 -0.563 +0.046634 +0.99999 -0.00001 -0.503 +0.001945 +1.00000 -0.00000 -0.500 +0.00000

    Gefinni samleitni hefur verið náð.Núllstöðin er: 1.00000

    >> newton(f,df,3,1e-10,25)n x_n x_(n+1)-x_n a b1 -0.29584 +0.360312 -0.65615 -2.11587 +2.465 +0.461953 +1.45972 -0.79287 +0.472 -0.504844 +2.25259 +1.40954 -0.013 -0.771415 +0.84305 -0.86012 -0.068 -0.521276 +1.70317 +0.90501 -0.101 -0.381287 +0.79816 -0.18110 -0.220 -0.201388 +0.97926 -0.02057 -0.666 +0.119179 +0.99983 -0.00017 -0.514 +0.01051

    10 +1.00000 +0.00000 -0.500 +0.0000811 +1.00000 +0.00000 -0.579 -0.00000

    Gefinni samleitni hefur verið náð.Núllstöðin er: 1.00000

    >> f=@(x)x^3+2*x;>> df=@(x)3*x^2+2;>> newton(f,df,2,1e-10,50)

    n x_n x_(n+1)-x_n a b1 +1.14286 +0.638422 +0.50443 +0.41154 +1.010 +0.644613 +0.09290 +0.09211 +0.544 +0.22381

    3

  • 4 +0.00079 +0.00079 +0.093 +0.008595 +0.00000 +0.00000 +0.001 +0.000006 +0.00000 +0.00000 +0.000 +0.00000

    Gefinni samleitni hefur verið náð.Núllstöðin er: 0.00000

    Eins og sjá má á dálk a er aðferðin ferninssamleitin þar sem a stefnir á fasta.

    c) Dæmi um fall sem virkar ekki að finna núllstöð með newton aðferðinni er x3−2x+2þegar upphafspunkturinn núll er valinn. Þá virkar aðferðin ekki þar sem hún lendir íóendanlegu ferli sem kemur í veg fyrir samleitni.

    >> f=@(x)x^3-2*x+2;>> df=@(x)3*x^2-2;>> newton(f,df,0,1e-10,25)

    n x_n x_(n+1)-x_n a b1 +1.00000 +1.000002 +0.00000 -1.00000 -1.000 -1.000003 +1.00000 +1.00000 +1.000 -1.000004 +0.00000 -1.00000 -1.000 -1.000005 +1.00000 +1.00000 +1.000 -1.000006 +0.00000 -1.00000 -1.000 -1.000007 +1.00000 +1.00000 +1.000 -1.000008 +0.00000 -1.00000 -1.000 -1.000009 +1.00000 +1.00000 +1.000 -1.00000

    10 +0.00000 -1.00000 -1.000 -1.0000011 +1.00000 +1.00000 +1.000 -1.0000012 +0.00000 -1.00000 -1.000 -1.0000013 +1.00000 +1.00000 +1.000 -1.0000014 +0.00000 -1.00000 -1.000 -1.0000015 +1.00000 +1.00000 +1.000 -1.0000016 +0.00000 -1.00000 -1.000 -1.0000017 +1.00000 +1.00000 +1.000 -1.0000018 +0.00000 -1.00000 -1.000 -1.0000019 +1.00000 +1.00000 +1.000 -1.0000020 +0.00000 -1.00000 -1.000 -1.0000021 +1.00000 +1.00000 +1.000 -1.0000022 +0.00000 -1.00000 -1.000 -1.0000023 +1.00000 +1.00000 +1.000 -1.0000024 +0.00000 -1.00000 -1.000 -1.0000025 +1.00000 +1.00000 +1.000 -1.00000

    Hámarksfjöldi ítrana er náðNúllstöðin er: 1.00000

    d) Prófum föllin x2, x5, x2.

    >> f=@(x)x^2;

    4

  • >> df=@(x)2*x;>> newton(f,df,-2,1e-10,10)

    n x_n x_(n+1)-x_n a b1 -1.00000 -0.500002 -0.50000 -0.25000 -1.000 +0.500003 -0.25000 -0.12500 -2.000 +0.500004 -0.12500 -0.06250 -4.000 +0.500005 -0.06250 -0.03125 -8.000 +0.500006 -0.03125 -0.01563 -16.000 +0.500007 -0.01563 -0.00781 -32.000 +0.500008 -0.00781 -0.00391 -64.000 +0.500009 -0.00391 -0.00195 -128.000 +0.50000

    10 -0.00195 -0.00098 -256.000 +0.50000Hámarksfjöldi ítrana er náðNúllstöðin er: -0.00195

    >> f=@(x)x^5;>> df=@(x)5*x^4;>> newton(f,df,1,1e-5,10)

    n x_n x_(n+1)-x_n a b1 0.80000 0.160002 0.64000 0.12800 5.000 0.800003 0.51200 0.10240 6.250 0.800004 0.40960 0.08192 7.813 0.800005 0.32768 0.06554 9.766 0.800006 0.26214 0.05243 12.207 0.800007 0.20972 0.04194 15.259 0.800008 0.16777 0.03355 19.073 0.800009 0.13422 0.02684 23.842 0.80000

    10 0.10737 0.02147 29.802 0.80000Hámarksfjöldi ítrana er náðLokasvar: 0.10737

    >> f=@(x)x^20;>> df=@(x)20*x^19;>> newton(f,df,1,1e-5,15)

    n x_n x_(n+1)-x_n a b1 0.95000 0.047502 0.90250 0.04512 20.000 0.950003 0.85738 0.04287 21.053 0.950004 0.81451 0.04073 22.161 0.950005 0.77378 0.03869 23.327 0.950006 0.73509 0.03675 24.555 0.950007 0.69834 0.03492 25.847 0.950008 0.66342 0.03317 27.207 0.950009 0.63025 0.03151 28.639 0.95000

    10 0.59874 0.02994 30.147 0.9500011 0.56880 0.02844 31.733 0.9500012 0.54036 0.02702 33.404 0.9500013 0.51334 0.02567 35.162 0.9500014 0.48767 0.02438 37.012 0.95000

    5

  • 15 0.46329 0.02316 38.960 0.95000Hámarksfjöldi ítrana er náðLokasvar: 0.46329

    Eins og sjá má á dálki a stefnir það á óendanlegt og dálkur b stefnir á fasta þar afleiðandi er það ekki ferningssamleitið.

    1.2 Helmingunaraðferð og aðferð Newtons sameinaðara) Forritið finnur núllstöðvar falls með því að styðjast við aðferð Newtons og helming-urnaraðferðina. Forritið tekur inn fallið f, afleiðu fallsins, df, bilið sem punktarnir a ogb afmarka og skekkjuna �.Virkni forritsins er þannig að við byrjum á að athuga hvort punktarnir sem notandinnvaldi eru núllstöðvar ef svo er birtast núllstöðvarnar og forritið hættir. Ef fallgildin hafasömu formerki stöðvast forritið og gefur villumeldingu þar sem helmingunaraðferðingengur ekki.Ef punktur er innan bilsins þá er hann nýji miðpunktur bilsins og notum helmingun-araðferðina á hann. Ef hann fellur utan bilsins þá er Newton sleppt og farið er beint íhelmingunaraðferðina

    % Töluleg greining, vor 2012: Verkefni I, 1.2% Höfundar: Guðjón Henning Hilmarsson, Hulda Jónasdóttir og% Jóhanna Björk Pálsdóttir% Dags: 10.02.2012

    function binewton(f,df,a,b,epsilon)%Forritið finnur núllstöð á falli f með því að styðjast við%aðferð Newtons og helmingunarleit. Ef aðferð Newtons skilar%punkti utan við bilið sem við vitum að núllstöðin er á,%Þá gríum við til helmingunaraðferðarinnar. Bilið þar sem%vitum að rótin er, er [a,b], og hámarksskekkjan er epsilon.

    %Núllstillum breyturmis=0; mu=0; teljari=0;%Athugum fyrst hvort annar endapunta bilsins er rót þá er%núllstöðin fundinif (f(a)==0)

    p=a;fprintf('Núllpunkturinn er:, %7.5f\n',p);return;

    endif (f(b)==0)

    p=b;fprintf('Núllpunkturinn er:, %7.5f\n',p);return;

    end%Ef f(a) og f(b) hafa sama formerki hefur fallið ekki núllstöð%á bilinu samkvæmt milligildissetningunni eða fleiri en eina

    6

  • %núllstöð.if (f(a)*f(b)>0)

    error('f(a) og f(b) hafa sama formerki.');end%Prentum hausinn a töflunnifprintf('a\t \t \t b\t \t \t c\t \t \t f(a)\t \t \t f(b)\t \t f(c)\n')

    %Framkvæmum ítrunarskrefið þar til bilið sem inniheldur%lausnina er minna heldur en 2*epsilonwhile (abs(b-a)>=2*epsilon)

    %Finnum midpunkt bilsins [a,b]c=(a+b)/2;

    %Notum aðferð Newtons á punktinn c. Ef Newton gefur punkt innan%bilsins þá er sá punktur hinn nýji "miðpunktur" bilsins%og helmingunaraðferðinni er beitt á bilið með þessum nýja%miðpunkti. Ef punkturinn er hins vegar utan bilsins þá er%helmingunaraðferðinni beitt á bilið með "gamla" miðpunktinum.mis=f(c)/df(c);mu=c-mis;if mub

    %Aðferð Newtons skilar punkti utan bilsteljari=teljari+1;

    else%Aðferð Newtons skilar punkti innan bilsc=mu;

    end%Nú geta þrjú tilvik komið upp:%f(c) er rót%f(a) og f(c) hafa sama formerki, leitum að rót á bilinu [c,b]%f(c) og f(b) hafa sama formerki, leitum ad rot a bilinu [a,c]if (f(c)==0)

    p=c;fprintf('Núllpunkturinn er: %7.5f\n',p); return;

    elseif (f(c)*f(a)

  • >> f=@(x)x+0.1*sin(50*x);>> df=@(x)1+0.1*50*cos(50*x);>> binewton(f,df,-1,2,0.000001)

    a b c f(a) f(b) f(c)-1.00000 +0.41827 +0.41827 -0.97376 +0.50635 +0.50635-0.68354 +0.41827 -0.68354 -0.72068 +0.50635 -0.72068-0.10337 +0.41827 -0.10337 -0.01360 +0.50635 -0.01360-0.10337 +0.15745 +0.15745 -0.01360 +0.25743 +0.25743-0.03274 +0.15745 -0.03274 -0.13252 +0.25743 -0.13252-0.03274 +0.07855 +0.07855 -0.13252 +0.00781 +0.00781-0.01429 +0.07855 -0.01429 -0.07981 +0.00781 -0.07981-0.01429 +0.03213 +0.03213 -0.07981 +0.13206 +0.13206-0.00053 +0.03213 -0.00053 -0.00316 +0.13206 -0.00316-0.00053 +0.01580 +0.01580 -0.00316 +0.08684 +0.08684-0.00032 +0.01580 -0.00032 -0.00195 +0.08684 -0.00195-0.00032 +0.00774 +0.00774 -0.00195 +0.04547 +0.04547-0.00004 +0.00774 -0.00004 -0.00021 +0.04547 -0.00021-0.00004 +0.00385 +0.00385 -0.00021 +0.02299 +0.02299-0.00000 +0.00385 -0.00000 -0.00003 +0.02299 -0.00003-0.00000 +0.00192 +0.00192 -0.00003 +0.01152 +0.01152-0.00000 +0.00192 -0.00000 -0.00000 +0.01152 -0.00000-0.00000 +0.00096 +0.00096 -0.00000 +0.00577 +0.00577-0.00000 +0.00096 -0.00000 -0.00000 +0.00577 -0.00000-0.00000 +0.00048 +0.00048 -0.00000 +0.00288 +0.00288-0.00000 +0.00048 -0.00000 -0.00000 +0.00288 -0.00000-0.00000 +0.00024 +0.00024 -0.00000 +0.00144 +0.00144-0.00000 +0.00024 -0.00000 -0.00000 +0.00144 -0.00000-0.00000 +0.00012 +0.00012 -0.00000 +0.00072 +0.00072-0.00000 +0.00012 -0.00000 -0.00000 +0.00072 -0.00000-0.00000 +0.00006 +0.00006 -0.00000 +0.00036 +0.00036-0.00000 +0.00006 -0.00000 -0.00000 +0.00036 -0.00000-0.00000 +0.00003 +0.00003 -0.00000 +0.00018 +0.00018-0.00000 +0.00003 -0.00000 -0.00000 +0.00018 -0.00000-0.00000 +0.00002 +0.00002 -0.00000 +0.00009 +0.00009-0.00000 +0.00002 -0.00000 -0.00000 +0.00009 -0.00000-0.00000 +0.00001 +0.00001 -0.00000 +0.00005 +0.00005-0.00000 +0.00001 -0.00000 -0.00000 +0.00005 -0.00000-0.00000 +0.00000 +0.00000 -0.00000 +0.00002 +0.00002-0.00000 +0.00000 -0.00000 -0.00000 +0.00002 -0.00000-0.00000 +0.00000 +0.00000 -0.00000 +0.00001 +0.00001p_(n+1) lendir 16 sinnum utan við [a_n,b_n]

    >> f=@(x)x^4+0.01*cos(50*x);>> df=@(x)4*x^3-50*0.01*sin(50*x);>> binewton(f,df,0,0.05,1e-10)a b c f(a) f(b) f(c)+0.00000 +0.03165 +0.03165 +0.01000 -0.00011 -0.00011+0.01582 +0.03165 +0.01582 +0.00703 -0.00011 +0.00703+0.02374 +0.03165 +0.02374 +0.00375 -0.00011 +0.00375+0.02374 +0.03146 +0.03146 +0.00375 -0.00002 -0.00002

    8

  • +0.02760 +0.03146 +0.02760 +0.00190 -0.00002 +0.00190+0.02760 +0.03142 +0.03142 +0.00190 -0.00000 -0.00000+0.02951 +0.03142 +0.02951 +0.00095 -0.00000 +0.00095+0.02951 +0.03142 +0.03142 +0.00095 -0.00000 -0.00000+0.03046 +0.03142 +0.03046 +0.00048 -0.00000 +0.00048+0.03046 +0.03142 +0.03142 +0.00048 -0.00000 -0.00000+0.03094 +0.03142 +0.03094 +0.00024 -0.00000 +0.00024+0.03094 +0.03142 +0.03142 +0.00024 -0.00000 -0.00000+0.03118 +0.03142 +0.03118 +0.00012 -0.00000 +0.00012+0.03118 +0.03142 +0.03142 +0.00012 -0.00000 -0.00000+0.03130 +0.03142 +0.03130 +0.00006 -0.00000 +0.00006+0.03130 +0.03142 +0.03142 +0.00006 -0.00000 -0.00000+0.03136 +0.03142 +0.03136 +0.00003 -0.00000 +0.00003+0.03136 +0.03142 +0.03142 +0.00003 -0.00000 -0.00000+0.03139 +0.03142 +0.03139 +0.00001 -0.00000 +0.00001+0.03142 +0.03142 +0.03142 +0.00000 -0.00000 +0.00000p_(n+1) lendir 10 sinnum utan við [a_n,b_n]

    c) Teljara var bætt inn til að skoða hversu oft pn+1 lendir utan við bilið [an, bn], sjáforritið hér að ofan.

    d) Hægt er að bæta við hámarksfjölda ítrana við þessa aðferð til þess að stöðva keyrsl-una ef of langan tima tekur að finna núllstöðina.Einnig er hægt að bæta/breyta aðferðinni með því að nota sniðilsaðferðina í stað Newt-ons aðferðarinnar. Þannig er komist hjá því að reikna afleiðu fallsins í nálgunarpunkt-inum í hverri ítrun.

    2 LU-þáttun

    2.1 LU-þáttuna) Forritið framkvæmir LU þáttun á fylki með skalaðri hlutvendingu. Inntakið er fern-ingsfylki A og skilagildin eru neðra hornalínufylki L, efra hornalínufylki U og umröð-unarvigurinn r. Til þess að sannreyna lausnir er bætt við skilagildinu P sem er umröð-unarfylki. Sjá má nánar um virkni forritsins hér að neðan.

    % Töluleg greining, vor 2012: Verkefni I, 2.1% Höfundar: Guðjón Henning Hilmarsson, Hulda Jónasdóttir og% Jóhanna Björk Pálsdóttir% Dags:10.02.2012

    function [L,U,r] = lu_decom(A)% function [L,U,r,P] = lu_decom(A) %

  • s=[];[n,m]=size(A);r=[1:n];% Fyllt inn í s með stærsta staki hverrar línufor i=1:n

    mario=max(A(i,:));s=[s mario];

    end% Hér er sköluðu hlutvendingunni beitt og vigrinum endurraðað.% Búum til tómt fylki til þess að stinga inn í seinnaA_temp=zeros(n,n);for j=1:n-1

    vect_01=[];for k=j:n

    vect_01=[vect_01 abs(A(r(k),j))/s(r(k))];end%Finna hvar stærsta gildið er og skipta á línum. Hleypibreytan%k hleypur frá j upp í n svo "hvar" finnur stærsta stakið í%vigri sem er jafnstór eða minni en r. Þess vegna er faktorinn%"hvar+j-1" inn í reikningunum til þess að passa upp á vídd r.hvar=find(max(vect_01)==vect_01);hvar_2=r(hvar+j-1);r(hvar+j-1)=r(j);r(j)=hvar_2;%Tökum fylkið A_temp og söfnum inn í það stökum sem mynda L%fylkið. Þetta eru stökin sem eru rituð inn í sviga í staðinn%fyrir 0 í fylkinu sem reiknað er með í skalaðri hlutvendingu.A_temp(r(j+1:n),j)=(A(r(j+1:n),j)/A(r(j),j));%Gauss eyðingA(r(j+1:n),j:n)=A(r(j+1:n),j:n)-(A(r(j+1:n),j)/A(r(j),j))...

    *A(r(j),j:n);AA=A+A_temp;

    end%Annað tómt fylki búið til til þess að endurraða fylkinu AAAAA=zeros(n,n);for l=1:n

    AAA(l,:)=AA(r(l),:);end%Hér koma svo fylkin L og UU=zeros(n,n);L=eye(n);for m=1:n

    U(m,m:n)=AAA(m,m:n);L(m,1:m-1)=AAA(m,1:m-1);

    end%Hér er svo reiknað umröðunarfylkið P, notum þetta til þess%að sannreyna lausnir. Þetta er svo aftur notað í 2.3.% P=zeros(n,n);% for j=1:n% P(j,r(j))=1;% end

    10

  • b) Finnum LU þáttun á fylkinu

    1 4 2 0 9 2 55 9 3 6 7 2 14 0 1 5 2 0 87 4 2 15 6 9 11 11 4 6 1 3 94 6 15 22 9 8 14 6 3 6 25 5 6

    Skoðum einnig hvort forritið er rétt með því að láta Matlab reikna L · U og P · A ogsjá að það er jafngilt, sjá að neðan.

    A=[1 4 2 0 9 2 5;5 9 3 6 7 2 1;4 0 1 5 2 0 8;7 4 2 15 6 9 1;1 11 4 6 1 3 9;4 6 15 22 9 8 1;4 6 3 6 25 5 6];

    >> [L,U,r,P]=lu_decom(A)

    L =

    1.0000 0 0 0 0 0 00.8000 1.0000 0 0 0 0 00.8000 0.1667 1.0000 0 0 0 01.4000 1.1944 -0.0411 1.0000 0 0 00.8000 0.1667 0.0649 0.0074 1.0000 0 00.2000 -0.3056 0.0758 -0.3452 0.3256 1.0000 00.2000 -1.2778 0.1255 0.4104 -0.2926 -1.1325 1.0000

    U =

    5.0000 9.0000 3.0000 6.0000 7.0000 2.0000 1.00000 -7.2000 -1.4000 0.2000 -3.6000 -1.6000 7.20000 0 12.8333 17.1667 4.0000 6.6667 -1.00000 0 0 7.0671 0.6645 8.3853 -9.04110 0 0 0 19.7354 3.1721 4.13140 0 0 0 0 2.4675 2.60970 0 0 0 0 0 26.0007

    r =

    2 3 6 4 7 1 5

    P =

    0 1 0 0 0 0 00 0 1 0 0 0 00 0 0 0 0 1 00 0 0 1 0 0 0

    11

  • 0 0 0 0 0 0 11 0 0 0 0 0 00 0 0 0 1 0 0

    >> L*U

    ans =

    5.0000 9.0000 3.0000 6.0000 7.0000 2.0000 1.00004.0000 0 1.0000 5.0000 2.0000 0 8.00004.0000 6.0000 15.0000 22.0000 9.0000 8.0000 1.00007.0000 4.0000 2.0000 15.0000 6.0000 9.0000 1.00004.0000 6.0000 3.0000 6.0000 25.0000 5.0000 6.00001.0000 4.0000 2.0000 0 9.0000 2.0000 5.00001.0000 11.0000 4.0000 6.0000 1.0000 3.0000 9.0000

    >> P*A

    ans =

    5 9 3 6 7 2 14 0 1 5 2 0 84 6 15 22 9 8 17 4 2 15 6 9 14 6 3 6 25 5 61 4 2 0 9 2 51 11 4 6 1 3 9

    c) Prófum forritið á fylkjunum 1 2 34 5 67 8 9

    12 44 935 71 3

    1 50 0

    Sannreynum forritið með því að margfalda saman L og U í Matlab.

    >> M1=[1 2 3;4 5 6;7 8 9];>> [L,U,r,P]=lu_decom(M1)

    L =

    1.0000 0 00.1429 1.0000 00.5714 0.5000 1.0000

    U =

    12

  • 7.0000 8.0000 9.00000 0.8571 1.71430 0 0.0000

    r =

    3 1 2

    P =

    0 0 11 0 00 1 0

    %Skoðum hvort þetta sé rétt:

    >> L*U

    ans =

    7 8 91 2 34 5 6

    >> P*M1

    ans =

    7 8 91 2 34 5 6

    %Því sést að þetta er rétt þar sem L*U=P*M1

    >> M2=[12 44 93;5 71 3;1 50 0];>> [L,U,r,P]=lu_decom(M2)

    L =1.0000 0 00.0833 1.0000 00.4167 1.1367 1.0000

    U =12.0000 44.0000 93.0000

    0 46.3333 -7.75000 0 -26.9406

    r =

    1 3 2

    13

  • P =

    1 0 00 0 10 1 0

    %skoðað hvort þetta sé rétt:

    >> L*U

    ans =

    12 44 931 50 05 71 3

    >> P*M2

    ans =

    12 44 931 50 05 71 3

    %Því sést að þetta er rétt þar sem L*U=P*M2

    2.2 For- og endurinnsetninga) Forinnsetningarforritið tekur inn neðra hornalínufylkið L og vigurinn b. Síðan erforinnsetningu beitt til þess að finna lausnarvigurinn y. Forritið finnur því lausn áverkefninu Ly=b.Endurinnsetningarforritið tekur inn efra hornalínufylkið U og vigurinn y. Síðan erendurinnsetningu beitt til þess að finna lausnarvigurinn x. Forritið finnur því lausn áverkefninu Ux=y.

    % Töluleg greining, vor 2012: Verkefni I, 2.2% Höfundar: Guðjón Henning Hilmarsson, Hulda Jónasdóttir og% Jóhanna Björk Pálsdóttir% Dags: 10.02.2012

    function x=einnsetning(U,y)% Forritið tekur inn efra hornalínufylkið U og vigurinn y. Síðan er% reiknuð forinnsetning og skilað lausnarvigrinum x.% Finnum lengdina á vigrinum y og búum til lausnarvigurinn x,% sem við setjum inn stök í með forlykkjunni.n=length(y);

    14

  • x=zeros(n,1);for j=n:-1:1

    if (U(j,j)==0)error('viljum ekki núll á hornalínu');

    end%Hér er svo endurinnsetningin framkvæmd og lausnum stungið inn í%vigurinn x.x(j)=y(j)/U(j,j);y(j-1:-1:1)=y(j-1:-1:1)-U(j-1:-1:1,j)*x(j);

    end

    % Töluleg greining, vor 2012: Verkefni I, 2.2% Höfundar: Guðjón Henning Hilmarsson, Hulda Jónasdóttir og% Jóhanna Björk Pálsdóttir% Dags: 10.02.2012

    function y=finnsetning(L,b)% Forritið tekur inn neðra hornalínufylkið L og vigurinn b. Síðan er% reiknuð forinnsetning og skilað lausnarvigrinum y.% Finnum lengdina á vigrinum b og búum til lausnarvigurinn y,% sem við setjum inn stök í með forlykkjunni.n=length(b);y=zeros(n,1);for j=1:n

    if (L(j,j)==0)error('Viljum ekki núll á hornalínu');

    end%Hér er svo forinnsetningin framkvæmd og lausnum stungið inn í%vigurinn y.y(j)=b(j)/L(j,j);b(j+1:n)=b(j+1:n)-L(j+1:n,j)*y(j);

    end

    b) Leysum ȳ = L−1b̄ og x̄ = U−1ȳ, sjáum að með forinnsetningu og endurinnsetningufáum við sömu niðurstöðu fyrir vigrana.

    >> U=[4 -1 2 3;0 -2 7 -4;0 0 6 5;0 0 0 3];>> y=[20 -7 4 6];

    >> x=einnsetning(U,y')

    x =3

    -4-12

    % Athuga hvort þetta sé rétt lausn:

    15

  • >> x=U^-1*y'

    x =3.0000-4.0000-1.00002.0000

    % Því sést að endurinnsetningin virkar.

    >> L=[3 0 0 0;-1 1 0 0;3 -2 -1 0;1 -2 6 2];>> b=[5 6 4 2];

    >> y=finnsetning(L,b')

    y =1.66677.6667

    -14.333350.8333

    %Athuga hvort þetta sé rétt lausn:

    >> y=L^-1*b'

    y =1.66677.6667

    -14.333350.8333

    % Því sést að forinnsetningin virkar.

    2.3 Lausn á línulegu jöfnuhneppia) Leysum jöfnuhneppið

    1 4 2 0 9 2 55 9 3 6 7 2 14 0 1 5 2 0 87 4 2 15 6 9 11 11 4 6 1 3 94 6 15 22 9 8 14 6 3 6 25 5 6

    x =

    517952593280176

    með eftirfarandi forriti og sannreynum lausnina meðA\b og berum saman timann meðcputime fyrir allar keyrslurnar.

    16

  • % Töluleg greining, vor 2012: Verkefni I, 2.3% Hofundar: Guðjón Henning Hilmarsson, Hulda Jónasdottir og% Jóhanna Björk Pálsdottir% Dags: 10.02.2012

    function x = linhneppi(A,b)% Forritið leysir jöfnuhneppi Ax=b, með því að finna LU-þáttun á A% og notast svo við for- og endurinnsetningu til þess að finna lausn% fyrir dálkvigurinn b. Fylkið A er (nxn) fylki.

    %Reiknum tímann:t=cputime;%Skoðum stærðina á fylkinu A fyrir forlykkjuna.[n,m]=size(A);%Köllum á LU-þáttunarforritið til þess að fá neðra- og efra%þríhyrningsfylki og svo umröðunarvigurinn r.[L,U,r]=lu_decom(A);%Hér er svo reiknað umröðunarfylkið PP=zeros(n,n);for j=1:n

    P(j,r(j))=1;end%Nú er beitt for- og endurinnsetningu á L og U á dálkvigurinn%b til þess að finna lausnarvigurinn x.y=finnsetning(L,P*b);x=einnsetning(U,y);time=cputime-t

    >> A=[1 4 2 0 9 2 5;5 9 3 6 7 2 1;4 0 1 5 2 0 8;7 4 2 15 6 9 1;1 11 4 6 1 3 9;4 6 15 22 9 8 1;4 6 3 6 25 5 6];

    b=[51 79 52 59 32 80 176];

    >> x=linhneppi(A,b')

    time =

    0.0156

    x =1.00002.0000-4.00006.00007.0000-9.00001.0000

    % Tíminn við beinan reikning er:

    17

  • >> t=cputime;A\b'time=cputime-t

    ans =1.00002.0000-4.00006.00007.0000-9.00001.0000

    time =

    0.0468

    % Þannig að bæði er svarið rétt og aðferðin hraðvirkari% heldur en A\b'.

    b) Leysum önnur jöfnuhneppi og sannreynum lausnirnar

    b)$$$Prófum önnur fylki.$$$

    >> M1=[1 0 5;0 7 11;3 6 8];>> b=[1 24 6];

    >> x=linhneppi(M1,b')

    time =

    0

    x =

    -4.34781.74781.0696

    $$$Sannreynum hvort lausnin sé rétt.$$$

    >> t=cputime;x=M1\b'time=cputime-t

    18

  • x =

    -4.34781.74781.0696

    time =

    0

    $$$Svo lausnin er rétt.$$$$$$Skoðum annað fylki.$$$

    >> M2=[1 0 4 3;5 9 0 2;6 7 8 9;0 5 6 3];>> b=[10 5 22 42];

    >> x=linhneppi(M2,b')

    time =

    0

    x =

    -5.10383.59434.4623-0.9151

    $$$Sannreynum hvort lausnin sé rétt.$$$

    >> t=cputime;x=M2\b'time=cputime-t

    x =

    -5.10383.59434.4623-0.9151

    19

  • time =

    0.0468

    $$$Svo lausnin er rétt.$$$

    2.4 Viðbót fyrir bónusstigTökum nú inn fylki B af stærð nxm í staðinn fyrir vigur b

    function x = mlinhneppi(A,B)% x = linhneppi(A,b)% Leysir jöfnuhneppi Ax=B, með því að finna LU-þáttun á A% og notast svo við for- og endurinnsetningu til þess að finna lausn% fyrir dálkvigrana í B. Fylkið B er (nxm) fylki og A er (nxn) fylki.%% Töluleg greining, vor 2012: Verkefni I, 2.3.Bonus% Höfundar: Guðjón Henning Hilmarsson, Hulda Jónasdottir og% Jóhanna Björk Pálsdottir% Dags: 10.02.2012%Reiknum tímann:t=cputime;%skoðum stærðina á fylkjunum A og B fyrir forlykkjurnar[n,n]=size(A);[n,m]=size(B);%köllum á LU-þáttunarforritið til þess að fá neðra- og efra%þríhyrningsfylki og svo umröðunarvigurinn r.[L,U,r]=lu_decom(A);%Hér er svo reiknað umröðunarfylkið PP=zeros(n,n);for j=1:n

    P(j,r(j))=1;end% Nú er beitt for- og endurinnsetningu á L og U á dálkvigurinn B_i til þess% að finna lausnarvigurinn x_i.for i=1:m

    b=B(:,i);y(:,i)=finnsetning(L,P*b);x(:,i)=einnsetning(U,y(:,i));

    endtime=cputime-t

    >> A=[1 4 2 0 9 2 5;5 9 3 6 7 2 1;4 0 1 5 2 0 8;7 4 2 15 6 9 1;1 11 4 6 1 3 9;4 6 15 22 9 8 1;4 6 3 6 25 5 6];b=[51 79 52 59 32 80 176];B=[51 79 52 59 32 80 176;13 22 56 87 12 45 1;1 3 5 7 9 11 13;99 91 44 236 7 1999 3];

    20

  • $$$Notum enn fylkið A og prufum síðan vigurinn b og fylkið B.$$$

    >> X=mlinhneppi(A,b')

    time =

    0

    X =

    1.00002.0000-4.00006.00007.0000-9.00001.0000

    >> X=mlinhneppi(A,B')

    time =

    0

    X =

    1.0000 15.0894 -2.2129 43.84202.0000 -3.9178 0.4494 -47.9478-4.0000 5.1947 -1.7199 177.69616.0000 -5.3042 2.2057 -34.03197.0000 -3.3462 0.6384 -13.4136-9.0000 9.2599 -1.4658 41.16381.0000 2.9577 0.4082 -14.0097

    Guðjón Henning Hilmarsson

    Hulda Jónasdóttir

    21

  • Jóhanna Björk Pálsdóttir

    22