Pullon ulkopinta-ala??

Seuraa 
Viestejä45973
Liittynyt3.9.2015

Ongelmana on pullon ulkopinta-alan laskeminen. Pohjan säde on 3,5 cm, suun säde on 1 cm ja korkeus on 32 cm. Tilavuutena on litra... Eli olisiko kenelläkään aavistustakaan miten kyseinen tehtävä lasketaan?? Kiitos

Tehtävä liittyy optimointiin.... pitäisi saada tehtyä kohdefunktio matlab:n.

Sivut

Kommentit (27)

Vierailija

Pullo muodostuu todennäköisesti suorasta ympyrälieriöstä ja katkaistusta kartiosta. Asetetaan niille alkuehtojen mukaan mitat, jolloin jotain mittoja jää tuntemattomaksi. Niiden tuntemattomien ja tunnettujen mittojen pitäisi sitten tuottaa tilavuudeksi 1 litra -> saadaan aikaan tarvittavat yhtälöt.

Lisäystä. Tuntematon tässä on siis se, miltä korkeudelta pullo alkaa kaventua eli missä on lieriön ja kartion raja.

Vierailija

Jos tehtävä optimointiin liittyy niin varmastikkin kohdefunktiona on pullon ulkopinta-ala ja rajoitusehtona pullon tilavuus (1 litra).

Sinun täytyy parametrisoida pullon muoto r(x) jotenkin (esim. tavallinen polynomi, b-splini tai vastaava) ehdoilla että pohjalla r on 3.5cm ja suulla 1.0cm ja pullon korkeus (integroimisvälin pituus) 32cm

Kohdefunktiosta (pinta-ala) ja rajoitusehdosta (tilavuus) tulee kummastakin integraali, jonka kyllä ainakin polynomin tapauksessa saa symboliseksi funktioksi parametrien arvoista. Mutta kyllä ne voi numeerisestikin määrittää.

Mikä se ongelmasi sitten on?

Vierailija

Siis tulokseksi halutaan kaikkein pienimmällä ulkopinta-alalla varustettu yhden litran pullo?
Eli pullon sivun on oltava mahdollisimman lyhyt.
Lyhyin mahdollinen on tässä tapauksessa suora, eli pullo on suora ympyräkartio (katkaistu kohdalta, jossa säde on 1cm).
Mikä tahansa mutka pullossa suurentaa pinta-alaa.

Jos kyse on siis tämänkaltaisesta optimoinnista...

Vierailija

Mitä jos kyseessä onkin Kleinin pullo? No, sen tilavuus on ainakin helposti laskettavissa mutta sillä putelilla ei sitten juurikaan janoa sammutella!

Vierailija

(Froggy) Niin ilmeisesti, paitsi vaadittiin, että pohjan säde on 3.5cm, suun säde 1.0cm ja korkeus 32cm. Voisin mennä vaikka vannomaan että nuo mitat täyttävä suora (katkaistu) ympyräkartio ei ole tilavuudeltaan yhtä litraa (mitä en jaksa nyt tarkistaa). Pullon sivussa täytyy siis olla "mutkia". Olen myös varma että optimimuoto ei ole sellainen joka koostuu lieriöstä ja katkaistusta kartiosta, sillä terävä kulma tarkoittaa aina, että jostain oltaisiin voitu "oikaista". Ja muutenkin "sileä" pullo on ihanteellisempi kuin kulmikas.

Vierailija

Tärkeintä on sisältö ja varsinkin se ettei se ole vielä tyhjä.
Hirvee krapula, onkohan jääkaapissa juomaa, täytyy selvittää asia.

bosoni
Seuraa 
Viestejä2704
Liittynyt16.3.2005

Eikös tuo mene variaatiolaskennalla ainakin. Sitä en tiedä, osaako matlab ratkoa niitä, mutta periaatteessa tuossa ratkaisua voisi lähtea hakemaan funktionaalina. Tarkastellaan pulloa pyörähdyskappaleena, joka on funktion y pyörähdyskappale x-akselin ympäri.

Etsitään funktionaalin J= 2*Pii*int(y*sqrt(1+(y')²))dx (pinta-ala) ääriarvo
sidosehdolla K= Pii*int(y²)dx-V=0 (tilavuus sidottu)

Eli lasketaan funktionaalin L = J+lamda*K stationääriset arvot.

PS: voin itsekin innostua ehkä laskemaan tuota loppuviikosta, kun pahimmat kiireet ovat ohi. Pitäisi tulla tuosta ensimmäisen kertaluokan diffisyhtälö, koska x ei esiinny funktionaalissa, vaan vain y ja y'.

Jos sorruin (taas) virheeseen, niin tukka varmaan vain oli silmillä, kuten kuva osoittaa...

David
Seuraa 
Viestejä8875
Liittynyt25.8.2005

Näin ensituntumalla sanoisin, että mahdollisimman pallomainen pinta on optimaalisin. eli mahdollisimman lähellä puolipalloa oleva muoto pohjan ulkoreunan ja pullon suun välisellä linjalla. Optimointi pitänee tehdä siis sitten sen säteen suhteen. Liian pieni säde ei riitä pullon pituuteen ja liian suuri säde ei riittäne tilavuuteen.

bosoni
Seuraa 
Viestejä2704
Liittynyt16.3.2005
Froggy

Eli pullon sivun on oltava mahdollisimman lyhyt.
Lyhyin mahdollinen on tässä tapauksessa suora, eli pullo on suora ympyräkartio (katkaistu kohdalta, jossa säde on 1cm).
Mikä tahansa mutka pullossa suurentaa pinta-alaa.

Tuli mieleeni tästä, vaikka tuohon alkuperäiseen tehtävään ei liitykään. Jos pullon ainoat rajoitteet ovat korkeus, suun ja pohjan halkaisija, niin pienimmän mahdollisen pinnan virittäminen siihen väliin ei ole katkaistu ympyräkartio. Oikea vastaus pienimmälle pinnalle on semmoinen "lommollaan" oleva muoto. Intuitio huijaa joskus liiallisella yksinkertaistamisella. Tuota voi periaatteessa kokeillakin saippuakalvoilla.

edit: muistin, että tuo oli löytyy hyllystä laskuesimerkkinä ja vastaus on y=C1cosh([x-C2]/C1), jossa nuo vakiot voidaan määrätä pohjan ja "kannen" halkaisijasta. Graafisesti tuo muistuttaa hieman jonkinlaista torvea.

Jos sorruin (taas) virheeseen, niin tukka varmaan vain oli silmillä, kuten kuva osoittaa...

Vierailija

kyllä sun täytyy lähteä pallopinnasta, ja siihen nokka. Jos olet käynyt käynyt kemian labrassa varmaan näit pallomaisia astioita joissa ohut suora kaula. Integraalilaskenta lienee tuttua? En osaa mathlab-kieltä? ja
auttaminen näin vaikeaa.

David
Seuraa 
Viestejä8875
Liittynyt25.8.2005

Viesti poistettu, pannaanpas uudelleen harkintaan ....

Pallon muoto on joka tapauksessa se, mikä peruskappaleena sulkee sisäänsä suurimman tilavuuden suhteessa pinta-alaan. Osittain lieriömäisessä kappaleessa muoto ei välttämättä ole kuitenkaan ihan niin yksiselitteinen. Ilmeisesti se muoto suuaukon päässä tulee olla suippo, jotta sinne isompaan päähän (eli lähemmäksi pohjaa) saadaan sitten hyödynnettyä se maksimi pallomaisuuden tuoma etu.

Vierailija

Rupesin mielenkiinnosta "häsläämään" tämän tehtävän ja MATLABin kanssa. Käytin muodon määrittämiseen polynomia ja suoritin optimoinnin peräkkäisinä lineaarisina optimointitehtävinä (Sequential Linear Programming) . Linearisoinnissa tarvittavat gradientit määritin kylmästi differenssimenetelmällä. Jaoin pullon korkeuden tasasiin väleihin ja muuttujina olivat säteen arvot kyseisissä pisteissä. Koodi käy kaikki valittua alemman asteiset polynomit läpi ja käyttää aina edellisen asteluvun lopputulosta seuraavaan asteluvun optimointitehtävän alkuarvona Koodi toimii hyvin noin 6. asteen polynomiin asti, mutta sen jälkeen se karkaa toisinaan käsistä riippuen valittujen parametrien arvoista.

Kun säteen sallittu minimiarvo rmin = 1cm, maksimiarvo rmax = 5cm, korkeus h = 32cm, pohjan säde 3.5cm, suun säde 2cm ja vaadittu tilavuus V = 1000 sain 10. asteen polynomilla (n=10) tulokseksi

X =

0
3.2000
6.4000
9.6000
12.8000
16.0000
19.2000
22.4000
25.6000
28.8000
32.0000

R =

3.5000
4.7689
5.0000
4.9069
3.4850
1.7204
1.0000
1.0000
1.0000
1.0000
2.0000

Eli tuollaiseksi se haluaa tulla, että kaula on ohut ja pohjalla on melkein pallomainen laajennus. Jos säteen minimiarvo on nolla, tuo kaula lähestyy äärettömän ohutta (nyt säde oli kaikkialla rajoitettu 1cm:n ja 5cm:n välille). Niin ja tuossa kuvassa mainitussa pinta-alassa ei ole sitten pullon pohjan pinta-ala mukana.

Ja itse (kommentoimaton) MATLAB-koodi ,jota tuskin kukaan jaksaa katsella:
[code:1ojojpvt]
function [X,R] = pullo(nmax,korkeus,rpohja,rsuu,Vraj,rmin,rmax)
xpohja = 0;
xsuu = korkeus;
options = optimset('LargeScale','off');
X = linspace(xpohja,xsuu,3);
R0 = (rmax-rmin)/2*ones(size(X));
for n = 2:nmax
X0 = X;
X = linspace(xpohja,xsuu,n+1);
R0 = r(X,X0,R0);
A0 = A(X,R0);
LB = rmin*ones(1,length(X));
LB(1) = 0;
LB(end) = 0;
UB = rmax*ones(1,length(X));
UB(1) = Inf;
UB(end) = Inf;
DRL = 0.75^n*(rmax-rmin)*ones(length(R0),1);
DRU = 0.75^n*(rmax-rmin)*ones(length(R0),1);
for i = 1:50
f = kohdefunktio(X,R0);
[Aeq,beq] = rajoitusyhtalo(X,R0,rpohja,rsuu,Vraj);
[Aueq,bueq] = rajoitusepayhtalo(X,R0,n,xpohja,xsuu,rsuu,rmin,rmax);
lb = max([LB; R0(:)'-DRL'])';
ub = min([UB; R0(:)'+DRU'])';
R = linprog(f,Aueq,bueq,Aeq,beq,lb,ub,[],options);
A_ = A(X,R);
V_ = V(X,R);
disp(['KIERROS ' num2str(i) ' (n = ' num2str(n) ')'])
disp(['Pinta-ala: ' num2str(A_)])
disp(['Tilavuus: ' num2str(V_)])
disp(' ')
if max(abs((A_-A0)/A0),abs((V_-Vraj)/Vraj)) < 1e-3, break, end
DRL = 1e-3^(1/50)*DRL;
DRU = 1e-3^(1/50)*DRU;
R0 = R;
A0 = A_;
end
end
X = X(:);
subplot(1,2,1)
z_ = linspace(xpohja,xsuu,100);
r_ = r(z_,X,R0);
plot(r_,z_)
axis equal
axis([0 rmax*1.1 z_(1) z_(end)])
grid on
xlabel('säde')
ylabel('korkeus')
subplot(1,2,2)
t_ = linspace(0,2*pi,100);
X_ = r_(:)*cos(t_);
Y_ = r_(:)*sin(t_);
Z_ = repmat(z_',1,length(t_));
lighting phong;
material shiny;
colormap summer;
surf(X_,Y_,Z_,'edgecolor','none','facecolor','interp')
axis equal
light('position',[-1 -1 1]);
title(['A = ' num2str(A_,'%.4g') ' V = ' num2str(V_,'%.4g')])

function f = kohdefunktio(X,R0)
f = nabla_A(X,R0);

function [Aeq,beq] = rajoitusyhtalo(X,R0,rpohja,rsuu,Vraj)
grad_V0 = nabla_V(X,R0);
Aeq(1,:) = grad_V0';
Aeq(2,1) = 1;
Aeq(3,end) = 1;
beq(1,1) = Vraj - V(X,R0) + grad_V0'*R0(:);
beq(2,1) = rpohja;
beq(3,1) = rsuu;

function [Aueq,bueq] = rajoitusepayhtalo(X,R0,n,xpohja,xsuu,rsuu,rmin,rmax)
grad_rminmax = nabla_rminmax(X,R0,n,xpohja,xsuu,rsuu);
rminmax_ = rminmax(X,R0,n,xpohja,xsuu,rsuu);
Aueq = [-grad_rminmax'; grad_rminmax'];
bueq = [-rmin*ones(size(grad_rminmax,2),1) + rminmax_ - grad_rminmax'*R0(:);
rmax*ones(size(grad_rminmax,2),1) - rminmax_ + grad_rminmax'*R0(:)];

function nabla_A = nabla_A(X,R)
nabla_A = zeros(length(R),1);
dR = zeros(size(R));
e = max(R)*1e-3;
for i = 1:length(R)
dR(i) = e;
nabla_A(i) = (A(X,R+dR)-A(X,R))/e;
dR(i) = 0;
end

function nabla_V = nabla_V(X,R)
nabla_V = zeros(length(R),1);
dR = zeros(size(R));
e = max(R)*1e-3;
for i = 1:length(R)
dR(i) = e;
nabla_V(i) = (V(X,R+dR)-V(X,R))/e;
dR(i) = 0;
end

function A = A(X,R)
A = quad(@A_integrandi,X(1),X(end),1e-4,[],X,R);

function V = V(X,R)
V = quad(@V_integrandi,X(1),X(end),1e-4,[],X,R);

function A_integrandi = A_integrandi(x,X,R)
A_integrandi = 2*pi.*r(x,X,R).*sqrt(1+drdx(x,X,R).^2);

function V_integrandi = V_integrandi(x,X,R)
V_integrandi = pi*r(x,X,R).^2;

function drdx = drdx(x,X,R)
e = abs(max(x))*1e-3;
drdx = (r(x+e,X,R)-r(x,X,R))/e;

function r = r(x,X,R)
r = zeros(size(x));
for i = 1:length(x)
r(i) = N(x(i),X)*R(:);
end

function N = N(x,X)
n = length(X);
N = ones(1,length(X));
for j = 1:n
for i = 1:n
if i ~= j, N(j) = N(j) * (x-X(i))/(X(j)-X(i)); end
end
end

function nabla_rminmax = nabla_rminmax(X,R,n,xpohja,xsuu,rsuu)
rminmax_ = rminmax(X,R,n,xpohja,xsuu,rsuu);
nabla_rminmax = zeros(length(R),length(rminmax_));
dR = zeros(size(R));
e = max(R)*1e-3;
for i = 1:length(R)
dR(i) = e;
rminmax_e = rminmax(X,R+dR,n,xpohja,xsuu,rsuu);
for j = 1:length(rminmax_)
if length(rminmax_) == length(rminmax_e)
nabla_rminmax(i,j) = (rminmax_e(j) - rminmax_(j))/e;
else
rminmax_e2 = rminmax(X,R+1e-2*dR,n,xpohja,xsuu,rsuu);
nabla_rminmax(i,j) = (rminmax_e2(j) - rminmax_(j))/e;
end
end
dR(i) = 0;
end

function rminmax = rminmax(X,R,n,xpohja,xsuu,rsuu)
p = polyfit(X(:),R(:),n);
k = polyder(p);
juuret = roots(k);
juuret = juuret(find(juuret > xpohja & juuret < xsuu & isreal(juuret)));
rminmax = polyval(p,juuret);
if isempty(rminmax), rminmax = rsuu; end
[/code:1ojojpvt]

bosoni
Seuraa 
Viestejä2704
Liittynyt16.3.2005

Melkein tuollaisia ruukkujahan on jopa olemassa... Tuo tulos enteilee sitä, että variaatiolaskulla saatu diffisyhtälö tulisi olemaan hieman hankala analyyttisesti ratkaistaessa. Diffisyhtälöitäkin tietty voi ratkoa numeerisesti.

Jos sorruin (taas) virheeseen, niin tukka varmaan vain oli silmillä, kuten kuva osoittaa...

Sivut

Uusimmat

Suosituimmat