Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
SVEUČILIŠTE U SPLITU
FAKULTET ELEKTROTEHNIKE, STROJARSTVA I BRODOGRADNJE
Matematičko modeliranje forme broda
(manual and software test)
BRANKO BLAGOJEVIĆ
Zadatak:
Za aproksimaciju neke hidrodinamičke plohe definirane na pravokutnoj mreži točaka
( xi, yj ), i = 0,1,…,m ; j = 0,1,…,n , potrebno je definirati dvodimenzionalnu spline
funkciju u slijedećoj formi:
m
i
n
jjiji yxyyxS
0 0,,
gdje se za osnovnu funkciju koristi funkcija
111
111
110
iiiii
ii-i-ii-
ii-
i
, xx, za xxx/-xx
, xx, za xxx/x-x
, xx, za x
x
pri čemu je :
11
10
, j
, jx ji
Algoritam testirati na:
a) jednoj odabranoj analitičkoj površini (elipsoid, rotacioni paraboloid,..)
b) jednom tipičnom dijelu brodske forme sa nekom drugom metodom (NURBS)
Programi su pisani u Turbo C kompajleru i izvedeni su na računalu 486/80/8 s DOS
operativnim sustavom.
Program MATEMATICA 3.0 korišten je za rješavanje sustava jedndžbi ( datoteke s
ekstenzijom *.nb ) i radi pod operativnim sustavom Windows 95.
1. Testiranje spline funkcije preko rotacionog paraboloida
U prvom dijelu zadatka algoritam za računanje vrijednosti zadane spline funkcije
testiran je usporedbom s vrijednostima z koordinata rotacionog paraboloida s
tjemenom u ishodištu koordinatnog sustava, zapisanog u formi:
Z = x2 + y2 (1)
Zbog simetričnosti paraboloida s obzirom na koordinatne osi za mrežu točaka ( xi, yj),
i = 0,1,…,m ; j = 0,1,…,n , uzeto je m = 50 i n = 50 ( nije se provjeravalo područje s
negativnim vrijednostima x i y koordinata mreže ).
Kod pokretanja programa potrebno je ubaciti koordinate točke xi i yj ( 0 < x < 50 i 0 <
y < 50 ), a program ispisuje rješenje za funkciju (1) i za zadanu dvodimenzionalnu
spline funkciju, kao i razliku rješenja.
Koeficijenti yi,j u zadanoj spline funkciji su u ovom slučaju jednaki z koordinati
rotacionog paraboloida, pa ova dvodimenzionalna spline funckija interpolira
paraboloid u svim točkama xi i yj, pa su odstupanja spline-a od paraboloida za
cjelobrojne vrijednosti xi i yj ( od 0 do 50 ) jednaka nuli.
Odstupanja rješenja po spline funkciji se kreću izmeĎu nule ( za točke x i y na mreži )
do 0.5 za vrijednosti u sredini segmenta x, x+1 i y,y+1.
/* PROGRAM 1 - parabola.exe - testiranje 2d spline funkcije preko rotacionog
paraboloida */
#include <stdio.h>
#include <conio.h>
#define n 50 /*definiranje domene x koordinate*/
#define m 50 /*definiranje domene y koordinate*/
float f[n],g[m]; /* f[n], g[m] - bazne funkcije */
main()
{
int i,j; /* pomoćne varijable */
float xk,yk,s; /*xk=x koordinata, yk=y koordinata, s=rješenje po spline funkciji*/
float zk,d; /*zk=z koor. rotacionog paraboloida, d=razlika rješenja */
float x[n],y[m];
float z[n][m];
xk=0;
yk=0;
s=0;
clrscr();
/* Unos podataka */
printf ("\n Unesite x koordinatu (broj izmeĎu 0 i 50) xk=");
scanf ("%f",&xk);
printf ("\n Unesite y koordinatu (broj izmeĎu 0 i 50) yk=");
scanf ("%f",&yk);
/* Pridruživanje vrijednosti x i y čvorovima mreže */
for (i=0;i<n;i++)
x[i]=i;
for (j=0;j<m;j++)
y[j]=j;
/* Vrijednosti z koordinata parova (x,y) = koeficijenti spline funkcije*/
for (i=0;i<n;i++)
for (j=0;j<m;j++)
z[i][j]=x[i]*x[i]+y[j]*y[j];
/* PRORAČUN BAZNIH FUNKCIJA */
for (i=1;i<50;i++)
for (j=1;j<50;j++)
{
if (xk > x[i+1] || xk < x[i-1])
f[i]=0;
else if (xk < x[i] && xk > x[i-1])
f[i]=(xk-x[i-1])/(x[i]-x[i-1]);
else if (xk > x[i] && xk < x[i+1])
f[i]=(x[i+1]-xk)/(x[i+1]-x[i]);
else if (xk==x[i])
f[i]=1;
if (yk > y[j+1] || yk < y[j-1])
g[j]=0;
else if (yk < y[j] && yk > y[j-1])
g[j]=(yk-y[j-1])/(y[j]-y[j-1]);
else if (yk > y[j] && yk < y[j+1])
g[j]=(y[j+1]-yk)/(y[j+1]-y[j]);
else if (yk==y[j])
g[j]=1;
s=s+z[i][j]*f[i]*g[j];
}
/* Ispis rezultata */
printf ("\n \n z koordinata po spline funkciji: S(x=%.4f, y=%.4f)=%.4f",xk,yk,s);
zk=xk*xk+yk*yk;
printf ("\n \n Egzaktno rješenje (rot.paraboloid): z=%4.4f",zk);
d=s-zk;
printf ("\n \n Odstupanje rješenja spline funkcije: Greška =%f",d);
getch();
}
2. Opis dijela forme broda dvodimenzionalnom spline funkcijom
Za potrebe ovog dijela zadatka izabran je ribarski brod projektiran u brodogradilištu
"Greben" , Vela Luka , glavnih dimenzija ( priložen je plan rebara broda ):
Loa = 23,19m
Lpp = 21,04m
B = 6,86m
H = 3,70m
Dio forme broda koji je opisan nalazi se na pramcu izmeĎu vodnih linija WL2 i WL8,
te izmeĎu rebara R5 i R9. Razmak vodnih linija je 0.3m, a razmak rebara je 2.1m.
Vodnih linija ima 4 (uzima se svaka druga, tj. WL2,4,6 i 8), a rebara ima 5 (gleda se
svako rebro 5,6,7,8 i 9). Presjecišta rebara i vodnih linija daju niz točaka koje čine
mrežu od 20 točaka u ravnini x-z. Rješanja koja se dobijaju su vrijednosti y , tj.
poluširine rebara.
Prilikom izvršavanja programa potrebno je unijeti:
x koordinatu u metrima i to izmeĎu 0m (R5) i 8.4m (R9)
z koordinatu i metrima i to izmeĎu 0.7m (WL2) i 2.5m (WL8)
Program ispisuje vrijednost poluširine y za unijete točke, te traži unos odgovarajuće
poluširine s nacrta linija i ispisuje razliku tih dviju vrijednosti.
/* PROGRAM 2 - spline2d.exe - opis forme broda 2d spline funkcijom */
#include <stdio.h>
#include <conio.h>
#define n 7 /*definiranje broja x koordinata mreže*/
#define m 6 /*definiranje broja z koordinata mreže*/
float f[n],g[m]; /* f[n], g[m] - bazne funkcije */
main()
{
/* Deklaracija varijabli */
int i,j; /* pomoćne varijable */
float xk,yk,s; /* xk=x koordinata, yk=z koor., s=rješenje po spline funkcijii */
float zk,d; /* zk=y koor. očitana sa nacrta, d = razlika rješenja */
float x[n]={0,0,2.1,4.2,6.3,8.4,10.5}; /* polje x koordinata = rebra broda */
/* NAPOMENA!! linije broda */
/* se gledaju od druge 0 u polju do 8.4 */
/* Prva vrijednost 0 i vrijednost 10.5 ne spadaju u područje */
/* definiranih linija broda već su potrebne */
/* kao potrebni preduvjeti kod programiranja*/
/* for petlje za proračun baznih funkcija. */
float y[m]={0,0.7,1.3,1.9,2.5,3.1}; /* polje z koordinata= WL broda */
/* NAPOMENA! kao gore */
/* polje z[ ][ ] = vrijednost y koordinata za gore navedene parove (x,z) */
float z[n][m]={{0,0,0,0,0,0}, /* NAPOMENA! Niz {0,0,0,0,0,0} kao */
{0,0.89,2.36,3.16,3.385,3.42}, /* i svaka prva 0 u svakom */
{0,0.84,2.25,2.99,3.245,3.34}, /* sljedećem retku definicije */
{0,0.65,1.72,2.435,2.81,3.04}, /* polja z[ ][ ] je napisana */
{0,0.345,1.065,1.63,2.055,2.33},/* zbog gornjih napomena, */
{0,0.15,0.45,0.75,1.045,1.39}}; /* i nema utjecaja na točnost */
/* rezultata, već postoji samo */
/* zbog mogućnosti programiranja */
/* for petlje baznih funkcija */
clrscr();
/* Sljedeća for petlja daje ispis vrijednosti y za svaki par koordinata (x,z)*/
/* Potrebno je izbrisati oznake komentara */
/* for (i=0;i<n;i++)
for (j=0;j<m;j++)
{ getch();
printf ("\n y[x=%2.3f, z=%2.3f]=%f",x[i],y[j],z[i][j]);
}*/
s=0; /* Inicijalizacija vrijednosti bazne funkcije */
clrscr();
/* Unos koordinata x i z , redom , za koje se računa vrijednost y */
printf ("\n Unesite x (izmeĎu 0m (Rebro 5) i 8.4m (Rebro 9) ) xk=");
scanf ("%f",&xk);
printf ("\n Unesite y (izmeĎu 0.7m (WL 2) i 2.5m (WL 8) yk=");
scanf ("%f",&yk);
/* Sljedeće for petlje -u komentarima -daju mogućnost unosa vrijednosti x, z i y jednu
po jednu s ekrana. U tom slučaju je potrebno obrisati vrijednosti polja unutar{}
za x[ ], y[ ] i z[ ][ ] kod deklaracije varijabli i obrisati komentare */
/* for (i=0;i<n;i++)*/ /* Unos vrijednosti x i z čvorova mreže
{ printf ("\n upišite koordinatu x%d =",i);
scanf ("%f",x[i]);
}
for (j=0;j<m;j++)
{ printf ("\n upišite koordinatu z%d = ",j);
scanf ("%f",y[j]);
}*/
/* for (i=0;i<n;i++)*/ /*vrijednosti y koordinata parova (x,z) = koeficijenti*/
/* for (j=0;j<m;j++)
{ printf ("\n upišite y koordinatu za (x=%2.2f, z=%2.2f )=",x[i],y[j]);
scanf ("%f",z[i][j]);
}*/
/* PRORAČUN BAZNIH FUNKCIJA */
for (i=1;i<6;i++)
for (j=1;j<5;j++)
{
if (xk > x[i+1] || xk < x[i-1])
f[i]=0;
else if (xk < x[i] && xk > x[i-1])
f[i]=(xk-x[i-1])/(x[i]-x[i-1]);
else if (xk > x[i] && xk < x[i+1])
f[i]=(x[i+1]-xk)/(x[i+1]-x[i]);
else if (xk==x[i])
f[i]=1;
if (yk > y[j+1] || yk < y[j-1])
g[j]=0;
else if (yk < y[j] && yk > y[j-1])
g[j]=(yk-y[j-1])/(y[j]-y[j-1]);
else if (yk > y[j] && yk < y[j+1])
g[j]=(y[j+1]-yk)/(y[j+1]-y[j]);
else if (yk==y[j])
g[j]=1;
s=s+z[i][j]*f[i]*g[j];
}
/* Ispis vrijednosti y proračunatog po spline fji */
printf ("\n \n y koordinata po spline funkciji: S(x=%.4f,z=%.4f)=%.4f",xk,yk,s);
/* Unos koordinate y s nacrta (za unesene vrijednosti x i z) */
printf ("\n \n Upišite y koordninatu s nacrta za (x=%2.2f, z=%2.2f)=",xk,yk);
scanf ("%f",&zk);
/* Računanje i ispis greške */
d=s-zk;
printf ("\n \n Odstupanje rješenja spline funkcije = %3.1f%",d);
getch();
}
3. Opis dijela forme broda NURBS plohom
Analitička formulacija NURBS plohe je:
n
j
lj
kii,j
m
i
n
j
lj
kii,ji,j
m
i
(v) (u) M NW
(v) (u) M N BW
Q(u,v)
11
11 (2)
gdje su:
u [uk-1, um+1], v [vl-1, vn+1] parametarske varijable
Bi,j kontrolne točke 3D mreže
Wi,j težine kontrolnih točaka
Nik (u), Mj
l (v) bazne funkcije reda k, odnosno l
Vrijednosti težina kontrolnih točaka su rezultat racionalne definicije plohe, tj. kao
omjera dvaju polinoma. Svrha težina je da omoguće točne opise koničnih oblika i da
daju dodatnu kontrolnu nad oblikom plohe. Inicijalno su vrijednosti težina jednake
1.0, što znači da sve točke imaju jednak utjecaj na izgled plohe. Vrijednosti težina
različite od 1.0 ne moraju nužno dati željene promjene na izgledu plohe, te u praksi
promjene težina mogu uzrokovati probleme kod dobivanja glatkih krivulja. Stoga se u
ovom slučaju uzima vrijednost težina jednaka 1.0 pa NURBS ploha postaje NUBS
ploha definirana relacijom:
n
j
lj
kii,j
m
i
(v) (u) M NBQ(u,v)11
(3)
Bazne funkcije se računaju kako slijedi:
stie vrijedno za ostal
xu za x(u)N ii
i,0
1 11
)()()( 1,
1
1,
1
ki, uNuu
uuuN
uu
uuuN kki
iki
kiki
iki
i
stie vrijedno za ostal0
yv za y1(v)M 1jj
1j,
)()()( 1,
1
1,
1
lj, vMvv
vvvM
vv
vvvM llj
jlj
ljlj
jlj
j
xi i yj su elementi vektora čvorova [X] i [Y];
k i l su redovi baznih funkcija N i M u smjeru u i v parametra; u ovom slučaju je
uzeto k = l = 3;
n i m su brojevi kontrolnih točaka Bi,j u smjeru parametara u i v
Bi,j su vrhovi kontrolnog poligona ( kontrolne točke )
Za poznati skup točaka kroz koje treba interpolirati (ili aproksimirati) NURB plohu
točke Bi,j su nepoznanice.
PROGRAM 3 ispisuje rješenja za matricu elemenata N*M potrebnu za izračunavanje
nepoznate matrice Bi,j točaka.
Definicija vektora čvorova, poznatih točaka na površini kao i broj parametra u i v
nalazi se unutar komentara u samom PROGRAMU 3.
Produkti baznih funkcija N*M (matrica sa 320 elemenata) ispisani startanjem
PROGRAMA 3 (nubs.exe) uneseni su u program MATEMATICA 3.0 (basfinal.nb) i
izračunata je nepoznata matrica kontrolnih točaka (matrica sadrži 3*16 elemenata),
tj. x, y i z koordinate za 16 kontrolnih točaka. Ta matraica može se pogledati u
datoteci Proračun_Bij.nb programom MATEMATICA 3.0 ).
Testiranje rezultata NUBS plohe izvodi se pomoću PROGRAMA 4 ( test.exe ).
Potrebno je unijeti podatke za po jedan parametar u i v ( u je zapravo x koordinata u
metrima, a v je z koordinata u metrima unutar ranije definiranog područja). Program
kao rezultat ispisuje 16 produkata N i M baznih funkcija za unesene parametre u i v, i
množenjem te matrice s prethodno izračunatom matricom točaka Bi,j dobije se
vrijednost poluširine y za unesene parametre. Priloženo je nekoliko testnih datoteka
(test*.nb ) napravljenih programom MATEMATICA 3.0.
U programu MATEMATICA 3.0 otvori se test.nb (mathematica notebook file)
datoteka priložena na disketi, gdje je samo potrebno na mjestu prve matrice unijeti
produkte N*M dobivene programom test.exe ( i to redom N1*M1, N1*M2, N1*M3, …,
N4*M3, N4*M4 ).Kao rješenje dobije se vrijednost NUBS plohe za unesene u i v , a
to je upravo poluširina broda y.
Na kraju ovog rada mogu se usporediti testni rezultati za nekoliko točaka plohe.
/* PROGRAM 3 - Nubs.exe Računa produkate N*M baznih funkcija 3. reda (k=3)
*/
#include <stdio.h>
float knot[20]; /* knot vector može imati 20 čvorova */
float z[8]={2,2,2,6,8,8,10}; /* knot vector po z koor. osi=razmak po dvije vodne linije*/
float x[8]={3,3,3,6,7,7,9,10}; /* knot vector po x koordinatnoj osi=razmak rebara*/
float u[6]={3,4,5,6,7}; /* 5 parametara u1 do u5 za x os, tj. r=5 */
float w[5]={2,4,6,8}; /* 4 parametra w1 do w4 za z os, tj. s=4 */
float basisfja(float,int,int); /* prototip bazne funkcije */
main()
{
float u1,a; /*u1=parametar u, a=vrijednost bazne fje*/
int k1,i1; /*k1=red bazne funkcije k, i1=broj kontrolnih točaka Bi*/
int b,c,j,l; /*lokalne varijable za FOR petlje i pomoćne varijable programa */
float N[10][10],M[10][10]; /*polja za vrijednosti baznih funkcija N i M*/
/*prvo polje je podatak o kontrolnoj točci*/
/*a drugo polje je parametar u, tj. w*/
/*tj. N[1][3] znači da bazna funkcijaja pripada*/
/*kontrolnoj točki B1 - polje [1], i*/
/*izračunata je za parametar u3-polje[3]*/
float produktnm; /* produkt N(u)*M(w) */
clrscr();
/* Inicijalizacija parametara i varijabli*/ /*Izbrisati komentare */
/* Unos podataka, red bazne fje i broj kontrolnih točaka*/
/* printf("\n Unesite red bazne funkcije k=");
scanf ("%d",&k1);*/
k1=3; /* red funkcije je fiksan =3*/
/*printf ("\n Unesite broj kontrolnih točaka B(i)=");
scanf ("%d",&i1);*/
i1=4; /* broj kontrolnih točaka za ovaj zadatak je fiksno 4*/
/*printf ("\n Unesite parametar u=");
scanf ("%f",&u1);*/
i1=i1-1; /* zato jer polja u c compileru počinju od 0*/
for (c=0;c<=8;c++) /*definiranje knot vectora za proračun baznih funkcija*/
knot[c]=x[c]; /*za točke na osi x - rebra broda*/
for (c=0;c<=4;c++) /* petlja za parametre u - od u1 do u5 */
{ for (b = 0; b <= i1; b++) /*petlja za kontr. točke B1 do B4*/
{
a=basisfja(u[c],b,k1); /* poziv potprograma za računanje bazne fje*/
N[b][c]=a;
/*printf ("\n N %d,%d [u%d=%f] = %f",b+1,k1,c+1,u[c],a);*/
}
/* printf ("\n \n");
getch();*/
}
for (c=0;c<=20;c++)
knot[c]=z[c];
for (c=0;c<=3;c++) /* petlja za parametre w - od w1 do w5 */
{ for (b = 0; b <= i1; b++) /*petlja za kontr. točke B1 do B4*/
{
a=basisfja(w[c],b,k1); /*poziv potprog. za računanje bazne fje*/
M[b][c]=a;
/*printf ("\n M %d,%d [w%d = %f] = %f",b+1,k1,c+1,w[c],a);*/
}
/* printf ("\n \n");
getch();*/
}
for (b=0;b<=4;b++) /* parametar u - u1 do u5 */
for (c=0;c<=3;c++) /* parametar w - w1 do w4 */
for (l=0;l<=3;l++)
for (j=0;j<=3;j++)
{ produktnm=N[l][b]*M[j][c];
printf ("\n N%d [u%d]*M%d [w%d]=%f",l+1,b+1,j+1,c+1,produktnm);
getch();
}
printf ("\n");
getch ();
}
/* PRORAČUN BAZNIH FUNKCIJA */
float basisfja(float t,int i, int k) /* donose se parametar t, */
{ /* broj kont.točaka i, */
/* red bazne fje k */
float n; /* n je vrijednost bazne fje koja se vraća u program */
/* printf("\n %f %f %f", x[i],x[i+k-1],x[i+k]); */
if (k==1)
{
if (knot[i]<=t && t<knot[i+1])
return(1);
else
return(0);
}
if (knot[i+k-1]-knot[i]==0)
n=((knot[i+k]-t)/(knot[i+k]-knot[i+1])*basisfja(t,i+1,k-1));
else if (knot[i+k-1]-knot[i]==0 && knot[i+k]-knot[i+1]==0)
n=0;
else if (knot[i+k]-knot[i+1]==0)
n=((t-knot[i])/(knot[i+k-1]-knot[i])*basisfja(t,i,k-1));
else
n=((t-knot[i])/(knot[i+k-1]-knot[i])*basisfja(t,i,k-1))+((knot[i+k]-t)/
/(knot[i+k]-knot[i+1])*basisfja(t,i+1,k-1));
return (n);
}
/* PROGRAM 4 test.exe - Računa produkte N*M baznih funkcija 3. reda (k=3) */
/* i to za po jedan parametar u i v koji se unose po pokretanju programa */
#include <stdio.h>
float knot[20];
float z[8]={2,2,2,6,8,8,10};
float x[8]={3,3,3,6,7,7,9,10};
float basisfja(float,int,int);
main()
{
float u1,w1,a; /*u1=parametar u, w1=parametar v, a=vrijednost bazne fje*/
int k1,i1; /*k1=red bazne funkcije k, i1=broj kontrolnih toźaka Bi*/
int b,c,j,l;
float N[10][10],M[10][10];
float produktnm;
clrscr();
/* Unos podataka, red bazne fje i broj kontrolnih tocaka*/
/* printf("\n Unesite red bazne funkcije k=");
scanf ("%d",&k1);*/
k1=3; /* red funkcije je fiksan =3*/
/*printf ("\n Unesite broj kontrolnih toźaka B(i)=");
scanf ("%d",&i1);*/
i1=4; /* broj kontrolnih točaka za ovaj zadatak je fiksno 4*/
printf ("\n Unesite parametar u=");
scanf ("%f",&u1);
printf ("\n Unesite parametar v=");
scanf ("%f",&w1);
i1=i1-1;
for (c=0;c<=8;c++)
knot[c]=x[c];
for (b = 0; b <= i1; b++) /*petlja za kontr. točke B1 do B4*/
{
a=basisfja(u1,b,k1);
N[b][u1]=a;
/*printf ("\n N %d,%d [u=%f] = %f",b+1,k1,u1,a);*/
}
/* printf ("\n \n");
getch();*/
for (c=0;c<=20;c++)
knot[c]=z[c];
for (b = 0; b <= i1; b++) /*petlja za kontr. točke B1 do B4*/
{
a=basisfja(w1,b,k1);
M[b][w1]=a;
/*printf ("\n M %d,%d [w = %f] = %f",b+1,k1,w1,a);*/
}
/* printf ("\n \n");
getch();*/
for (l=0;l<=3;l++)
for (j=0;j<=3;j++)
{ produktnm=N[l][u1]*M[j][w1];
printf("\n N%d[u=%f]*M%d[w=%f]=%f",l+1,u1,j+1,w1,produktnm);
getch();
}
printf ("\n");
/* getch ();*/
}
/* PRORAČUN BAZNIH FUNKCIJA */
float basisfja(float t,int i, int k) /* donose se parametar t, */
{ /* broj kont.točaka i, */
/* red bazne fje k */
float n; /* n je vrijednost bazne fje koja se vraća u program */
/* printf("\n %f %f %f", x[i],x[i+k-1],x[i+k]); */
if (k==1)
{
if (knot[i]<=t && t<knot[i+1])
return(1);
else
return(0);
}
if (knot[i+k-1]-knot[i]==0)
n=((knot[i+k]-t)/(knot[i+k]-knot[i+1])*basisfja(t,i+1,k-1));
else if (knot[i+k-1]-knot[i]==0 && knot[i+k]-knot[i+1]==0)
n=0;
else if (knot[i+k]-knot[i+1]==0)
n=((t-knot[i])/(knot[i+k-1]-knot[i])*basisfja(t,i,k-1));
else
n=((t-knot[i])/(knot[i+k-1]-knot[i])*basisfja(t,i,k-1))+((knot[i+k]-
t)/(knot[i+k]-knot[i+1])*basisfja(t,i+1,k-1));
return (n);
}
4. Usporedba rezultata
Rezultati za zadanu spline funkciju dobiveni su programom spline2d.exe, za NUBS
funkciju programima nubs.exe, test.exe i programom Matematica 3.0.
Stvarna očitanja izmjerena su sa originalnog nacrta linija broda u M 1:20.
Spline 2d funkcija NUBS ploha Očitanja s nacrta
linija
x = 1.05 m
z = 0.7 m 0,865 0,8797 0,91
x = 4.2 m
z = 0.7 m 0,65 0,6536 0,65
x = 5.25 m
z = 0.7 m 0,4975 0,515 0,505
x = 5.25 m
z = 2.5 m 2,4325 2,469 2,47
Tablica testnih rezultata
Iz tablice se vidi veća točnost rezultata dobivenih NUBS funkcijom nego
dvodimenzionalnom spline funkcijom.
Detalj koji je posebno zanimljiv su vrijednosti dobivene za točku x = 4,2 ( R7 ) i z=0.7
(WL 2), gdje se vidi da je dvodimenzionalna spline funkcija dala točno rješenje
y=0.65, što je i bilo za očekivati jer ona interpolira zadani skup točaka, do je NUBS
funkcija dala približno rješenje y = 0.6536 , iako i ova funkcija interpolira plohu u
zadanim točkama.
Razlog ovoj pogrešci je u tome što matrica N*M nije kvadratna (16*20 za 4*5 zadanih
točaka plohe) pa se rješenje matrice kontrolnih točaka Bij može dobiti samo približno.
Bolji rezultati bi se mogli postići višestrukom iteracijom ( do željene točnosti ),
vrijednosti parametra u i v za proračun produkata N*M.