MATLAB- apua

Seuraa 
Viestejä45973
Liittynyt3.9.2015

Eli tarvitsisin matlab-koodin, jonka avulla saisin ratkaistua seuraavan ongelman:
Millä kartion pohjan säteen ja kartion korkeuden arvoilla kartion pinta-ala on pienin, kun kartion tilavuus on 1 dm3.

Ilmeisestikin fminsearch-toimintoa pitäisi käyttää tuohon kartion pinta-alan funktioon, eli A=pi*r*(r^2+h^2)^(1/2), mutta miten?

Kommentit (14)

Vierailija
^Quantum^
Eli tarvitsisin matlab-koodin, jonka avulla saisin ratkaistua seuraavan ongelman:
Millä kartion pohjan säteen ja kartion korkeuden arvoilla kartion pinta-ala on pienin, kun kartion tilavuus on 1 dm3.

Ilmeisestikin fminsearch-toimintoa pitäisi käyttää tuohon kartion pinta-alan funktioon, eli A=pi*r*(r^2+h^2)^(1/2), mutta miten?

fminsearchille muistaakseni annetaan parametreiksi optimoitavat suureet ja niiden alkuarvot. Mietit vain, mikä parametri siinä on nyt sitten vakio, jota ei optimoida...

Vierailija
^Quantum^
Eli tarvitsisin matlab-koodin, jonka avulla saisin ratkaistua seuraavan ongelman:
Millä kartion pohjan säteen ja kartion korkeuden arvoilla kartion pinta-ala on pienin, kun kartion tilavuus on 1 dm3.

Ilmeisestikin fminsearch-toimintoa pitäisi käyttää tuohon kartion pinta-alan funktioon, eli A=pi*r*(r^2+h^2)^(1/2), mutta miten?

kartion pinta-alan funktioon, eli A=pi*r*(r^2+h^2)^(1/2) ????

Ala= Pohjanala+vaipanala

bosoni
Seuraa 
Viestejä2704
Liittynyt16.3.2005
^Quantum^
Taisin saada sen nyt toimimaan.
Kiitoksia.

Miten ratkaisit? Ei ainakaan onnistu pelkästään tuolla pinta-alan kaavalla, vaan jotenkin pitää ottaa mukaan se tilavuus.

Itse laskisin sen pinta-alan funktion käsin siten, että tilavuus pidetään vakiona. Esim. h ratkaistaan tilavuuden yhtälöstä r:n funktiona.

Sitten sijoitetaan matlabiin funktio A=inline('pi*r*sqrt(r^2+(3*V/(pi*r^2))^2)')
(Vpitää ensin määritellä)

ja haetaan minimi r komennolla ro= fminsearch(A,1)

Vai löytyyko tuon ehdon sijoittamiseen jokin sofistikoituneempi tapa?

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

Vierailija

Käytin fmincon toimintoa, johon saa suoraan argumentiksi tuon tilavuuden rajoituksen.
Eli fmincon(@ala,x0,[],[],[],[],[],[],@tilavuusrajoitus),
missä
@ala on
function A = ala(r)
A=pi*r(1)*(r(1)^2+r(2)^2)^(0.5) ja

@tilavuusrajoitus on
function [c,ceq]=tilavuusrajoitus(r)
c=0
ceq=(pi*r(1)^2*r(2))/3-1;

bosoni
Seuraa 
Viestejä2704
Liittynyt16.3.2005
^Quantum^
Käytin fmincon toimintoa, johon saa suoraan argumentiksi tuon tilavuuden rajoituksen.

Tuollainenkin löytyy... Pitääpä laittaa korvan taakse, jos sattuu tarvitsemaan.

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

Vierailija

Osaisiko joku kertoa miten matlabissa asetetaan funktio x^2*e^x*sin2x niin että kone hyväksyy sen ? pitäisi laskea kyseisen integraalin arvo välillä [1,5] ja tarvittavien jakovälien määrä 3, 6, 9 desimaalin tarkkuuteen.

bosoni
Seuraa 
Viestejä2704
Liittynyt16.3.2005

Luulen että ongelmana on kertoa jotain noiden funktioiden dimensioista, koska Matlabissa yleensä käytetään matriiseja ja vektoreita.

Ainakin itse kokeillessani laittamalla "1.*" noiden exp ja sin funktioiden eteen toimii. Esim exp(x) voidaan merkitä 1.*exp(x.*1)

ja x^2 pitää merkitä x.^2.

Edit: Ei mitään, näyttääkin tuo ohje toimivan riippumatta millä integroi.

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

Vierailija
bosoni
Luulen että ongelmana on kertoa jotain noiden funktioiden dimensioista, koska Matlabissa yleensä käytetään matriiseja ja vektoreita.

Ainakin itse kokeillessani laittamalla "1.*" noiden exp ja sin funktioiden eteen toimii. Esim exp(x) voidaan merkitä 1.*exp(x.*1)

ja x^2 pitää merkitä x.^2.


Olet oikeassa, mutta ei siinä mitään kryptistä "1.*" tarvita. Kyse on vain lausekkeen vektoroimisesta siten, että laskenta suoritetaan alkioittain jos muuttujat eivät ole skalaareita. Ja siihen tarkoitukseen riittää vain pelkkä piste "." operaattorin edellä. Eli jos on lauseke "1 / x", niin se vektoroidaan asettamalla piste jakomerkin eteen seuraavasti "1 ./ x". Samoin on mainitsemasi potenssiinkorotusoperaattorin kanssa "^" -> ".^". Sen sijaan valmisfunktioiden, kuten EXP(), SIN(), COSH(), SQRT() jne. tapauksissa asiaa ei tarvitse huomioida ollenkaan sillä ne vektoroituvat automaattisesti. Niin on myös skalaarilla kertomisen tai jakamisen tapauksessa sekä skalaarin kanssa yhteen- ja vähennyslaskuissa.

Eli lauseke "x^2*e^x*sin2x" vektoroidaan yksinkertaisesti seuraavasti "x.^2.*exp(x).*sin(2*x)". Silloin x voi olla minkäulotteinen tahansa taulukko ja lausekkeen arvo on yhtämoniulotteinen taulukko.

bosoni
Seuraa 
Viestejä2704
Liittynyt16.3.2005
boner
Eli lauseke "x^2*e^x*sin2x" vektoroidaan yksinkertaisesti seuraavasti "x.^2.*exp(x).*sin(2*x)". Silloin x voi olla minkäulotteinen tahansa taulukko ja lausekkeen arvo on yhtämoniulotteinen taulukko.



Ok. En ole käyttänyt vähään aikaan tuota ohjelmaa. Muistin vain että pisteellä jotenkin saadaan kerrottua ohjelmalle että alkioita halutaan käsitellä. Sitten loppu meni menetelmällä "kokeillaan kaikkea kunnes jotain toimivaa löytyy".

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

Vierailija

Kiitoksia avusta! kaavalla x.^2.*exp(x).*sin(2*x) se viimein asettui paikoilleen. En ymmärtänyt pistää nuita pisteitä oikeille kohilleen. Vielä olisi kysymys miten yhtälö y' = x*ln(x^2)+x*sin(3*x) kuuluisis asettaa että matlab ymmartäisi. varmaan taas pisteet väärällä paikoilla...

Vierailija

No siis ihan vastaavasti. Se piste liittyy sitä seuraavaan operaattoriin. Lauseke "x*ln(x^2)+x*sin(3*x)" on vektoroituna "x.*log(x.^2)+x.*sin(3*x)" (Matlabissa log = ln)

Uusimmat

Suosituimmat