Funciones MATLAB para Calcular Las Raíces de Una Ecuación
Funciones MATLAB para Calcular Las Raíces de Una Ecuación
Funciones MATLAB para Calcular Las Raíces de Una Ecuación
Inicio
MATLAB
Racesdeecuaciones
Sistemasdeecuaciones
Valoresyvectores
propios
Integracinnumrica
Ecuaciones
diferenciales
Interpolacin,regresin
Numrico
FuncionesMATLABparacalcularlasraces
deunaecuacin
Enestapgina,vamoscalcularlaracesdeunpolinomiomediantelafuncinroots.Unestudiomsdetalladode
lospolinomiosseencuentraenlapginatitulada"Polinomiosyfraccionespolinmicas".Larazdeunaecuacin
medianteprocedimientosgrficos,quenosvaaservirparaestimarunvalorprximoalarazbuscada.Lasraces
deunaecuacintranscendentemediantefzeroyfinalmente,lasracesdeunsistemadeecuacionestranscedentes
mediantefsolve.
Racesdeunpolinomio
Paracalcularlasracesdelaecuacin
Ejercicios
a1xn+a2xn1+...+anx+an+1=0
seemplealafuncinrootsyselepasaelvectorpformadoporloscoeficientesdelpolinomio.Lafuncinroots
devuelveunvectorcolumnaquecontienelasraces.
>>p=[a1a2...anan+1]
>>x=roots(p)
Lafuncinrootstieneunafuncininversapolyqueselepasaelvectorxquecontienelasracesydevuelvelos
coeficientesdelpolinomio
p=poly(x)
Seaf(x)=x53.5x4+2.75x3+2.125x23.875x+1.25
Guardamosloscoeficientesdelpolinomioenelvectorfilap=[13.52.752.1253.8751.25]
Mediantelafuncinplolyval,podemoscalcularelvalordelpolinomiocuandoproporcionamoselvalordex
>>p=[13.52.752.1253.8751.25]
>>polyval(p,1.5)%valordelpolinomiocuandoseproporcionaelvalordex.
ans=0.6250
>>r=roots(p)%racesdelpolinomio
r=
2.0000
1.0000
1.0000+0.5000i
1.00000.5000i
0.5000
>>c=poly(r)%reconstruimoselpolinomioapartirdelasraces
Comprobamosquelasracescalculadassoncorrectasutilizandolafuncinpolyval,pasndoleloscoeficientesdel
polinomiopyelvalorxidecadaunadelasraces
>>polyval([1332],2)
Comoejerciciosesugiereallector,hallarlasracesdelasecuacionessiguientesconlafuncinrootsyreconstruir
elpolinomioconlafuncinpoly,ocalcularelvalordelpolinomioparacadaunadelasracesconlafuncin
polyval
x3+x2+x+1=0
x5+x22x4=0
x5x4+x3+2x21
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices_2.html
1/8
24/4/2015
Procedimientogrfico
Vamosaestudiarvariosprocedimientosparacalcularlarazdeunaecuacintrascedente,porejemplo,x
cos(x)=0
Enprimerlugar,vamosahacerunarepresentacingrficadeestafuncinparaconoceraproximadamenteel
puntodondelafuncincortaalejeX.Escribimoselscriptmouse_raizyloguardamosunfichero.M
x=0:0.1:pi/2
y=xcos(x)
plot(x,y)
gridon
xlabel('x')
ylabel('y')
title('xcos(x)')
SeseleccionaenelmenTools/DataCursor,oeliconodelabarrahorizontaldeherramientas
.
Situamoselcursorenformadecruzprximoalarazdelafuncinypodemosleersuscoordenadas.Cuanto
mejorsealaresolucindelagrficamscercapodremosestardelarazbuscada.Laresolucindelagrficaesel
pasoxutilizado,paracalcularlatabladevalores(x,y)enelintervaloquevadesdexihastaxf.Enesteejemplo
x=0.1
PodemosutilizarlaherramientaZoomInyPan
paraacercarnosaestepuntoyelbotnZoom
Outparaalejarnosyvolveralasituacininicial.
EnlaimagenpodemosverquedespusdeacercarnosrepetidamentealpuntodecorteconelejeXmediante
ZoomInylamanoPan,larazbuscadaestcomprendidaentre0.735y0.74.
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices_2.html
2/8
24/4/2015
Racessimples
PodemosutilizarelpunterodelratnparabuscarlospuntosenlosquelafuncincortaalejeX,aadiendoel
comandoginputalfinaldelscriptmouse_raiz
x=0:0.1:pi/2
y=xcos(x)
plot(x,y)
gridon
xlabel('x')
ylabel('y')
title('xcos(x)')
[xRaiz,yRaiz]=ginput
Enlaventanadecomandoscorremoselscriptmouse_raiz.Larazbuscadasesealamedianteelcursorenforma
decruzdecolornegro.SepulsaelbotnizquierdodelratnyluegolateclaRetorno.
>>mouse_raiz
xRaiz=0.7379
yRaiz=0.0022
Racesmltiples
Silafuncintienemsdeunaraz,sesealacadaunodelospuntosdeinterseccindelafuncinconelejeX
conelpunterodelratnysepulsaelbotnizquierdodelratn.Finalmente,sepulsaRetornoyaparecenlas
abscisasenelvectorxRaizylasordenadasenelvectoryRaizdedichospuntos.
Nosaproximaremosalasracesqueyaconocemosdeunafuncinparailustraresteinteresanteprocedimiento
grfico
Guardamoselscriptmouse_raizmedianteFile/SaveAs..conelnombremouse_raiz_1.Modificamoselscript
pararepresentarlafuncincosenoconelejehorizontalengradosyloguardamosmedianteFile/Saveopulsando
eliconocorrespondiente.
Lasdosracesdecos(x)=0enelintervalo(0,360)son90y270.
x=0:1:360
y=cosd(x)
plot(x,y)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices_2.html
3/8
24/4/2015
Enlaventanadecomandoscorremoselscriptmouse_raiz_1.Enlaventanagrfica,pulsamosdosveceselbotn
izquierdodelratn:
1. cuandoelpunteroestsituadoaproximadamenteenelpuntodecoordendas(90,0),pulsamoselbotnizquierdo
delratn
2. cuandoelpunteroestsituadoenelpunto(270,0),pulsamoselbotnizquierdodelratn
3. pulsamosRetorno,
yobtenemoslosiguiente:
>>mouse_raiz_1
xRaiz=89.8618270.5069
yRaiz=0.00880.0029
Elprocedimientogrficonosdaunaestimacindelasraces(puntosdeinterseccinenlarepresentacingrfica
delafuncinconelejeX)deunaecuacintrascendenteenunintervalo(a,b)dado.
LafuncinMATLABfzero
Lafuncinfzeropuedeencontrarlarazdeunaecuacintrascendentef(x)=0.Susintaxises
fzero(funcion,x0)
Dondefuncioneselnombredelafuncincuyasracesqueremosdeterminaryx0eselintervalo[ab]dondela
funcincambiadesigno,esdecir,elsignodef(a)esdistintoalsignodef(b).x0puedesertambinunvalor
cercanoalarazesdecir,unaprimeraaproximacin.Podemosdefinirunafuncinannimayguardarlaenel
manejadorfunc.Lepasamoslafuncinannimafuncafzero.
Enlaventanadecomandos,definimoslafuncinybuscamosunintervalo[0.41]dondelafuncincambiade
signo.Alternativamente,probamosunaprimaraaproximacinalarazbuscadax0=0.6
>>func=@(x)cos(x)x
>>func(0.4)
ans=
0.5211
>>func(1)
ans=
0.4597
>>r=fzero(func,[0.41])%intervalodondeseencuentralaraz
r=0.7391
>>fzero(func,0.6)%aproximacininicialalaraz
ans=
0.7391
Podemosdefinirexplcitamentelafuncinfuncyguardarlaenelficherofunc.m
functiony=func(x)
y=cos(x)x
end
Llamamosafzeroanteponiendoalnombredelafuncinelsmbolo@(vasealfinaldelapginaFunciones)
>>fzero(@func,0.6)
ans=0.7391
Aveceslafuncinfuncdefinidayguardadaenunfichero.Mprecisadelosvaloresdeciertosparmetrosa,b
functiony=func(x,a,b)
%cdigodelafuncin
end
Afzerosolamentelepodemospasarelmanejador(handle)delafuncindevariablex.Laformaenquela
funcinfuncconoceelvalordesusparmetrosaybescrearunafuncinannimaf1entrminosdefuncysele
pasamossumanejadoralafuncinfzero
f1=@(x)func(x,a,b)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices_2.html
4/8
24/4/2015
Enelejercicio"LaecuacindevanderWaals"utilizaremosestaopcin.
Funcionesimplcitas
LasiguientefuncinseestudiaenlaasignaturaEnergaSolarFotovoltaica(tercercurso).
y = 3
510
12
x + 0.01y
exp
0.025
1)
x + 0.01y
1000
Dondexrepresentaladiferenciadepotencialeylaintensidaddelacorrienteelctrica.
Representamoslafuncinf(x,y)elintervalo[0,0.7]enelejeXyenelintervalo[0,3.1]enelejeY.Utilizamosla
funcinMATLABcontourquehabitualmenteseempleaparadibujarcurvasdenivel.
xx=linspace(0,0.7,50)
yy=linspace(0,3.1,100)
[x,y]=meshgrid(xx,yy)
f=35e12*(exp((x+y*0.01)/0.025)1)(x+y*0.01)/1000y
contour(x,y,f,[0,0],'r')
xlabel('d.d.p.V')
ylabel('Intensidad')
title('Fotovoltaica')
gridon
Unarepresentacingrficasimilarlaobtenemosconlafuncinezplot
Vamosaestudiarconmsdetalleestafuncin.
Enprimerlugar,sabemosqueparaelvalordexprximoa0.6V(diferenciadepotencial)laintensidadyvale
cero.EmpleamoslafuncinMATLABfzeroparaobtenerunvalormspreciso.
f=@(x,y)35e12*(exp((x+y*0.01)/0.025)1)(x+y*0.01)/1000y
g=@(x)f(x,0)
Vmax=fzero(g,0.6)
fprintf('Valormximodelad.d.p.%1.4f\n',Vmax)
Enlaventanadecomandosvemosestevalor
Valormximodelad.d.p.0.6780
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices_2.html
5/8
24/4/2015
Dadounvalordeladiferenciadepotencialxenelintervalo[0,0.678],queremosobtenerelcorrespondientevalor
delaintensidaddelacorrientey.Suministramosafzerounvalorprximoalarazbuscada,porejemplo,3.
Aadimoslassiguienteslneasdecdigoalscript.
....
x=0.6
g=@(y)f(x,y)
y=fzero(g,3)
fprintf('Paraunad.d.p.de%1.4flecorrespondeunaintensidadde%1.4f\n',x,y)
Enlaventanadecomandosvemosestevalor
Paraunad.d.p.de0.6000lecorrespondeunaintensidadde2.6214
Dadounvectordevaloresdeladiferenciadepotencialxelintervalo[0,0.678],queremosobtenerel
correspondientevectordeintensidadesy.Finalmente,conestosdosvectores(x,y)dibujaremoslacurvadiferencia
depotencialintensidadmedianteelcomandoplot.Elscriptcompletoeselsiguiente
f=@(x,y)35e12*(exp((x+y*0.01)/0.025)1)(x+y*0.01)/1000y
g=@(x)f(x,0)
Vmax=fzero(g,0.6)%intervalodevaloresdelad.d.p.[0,Vmax]
x=linspace(0,Vmax,100)
n=length(x)
opt=optimset('display','off')%evitaquefzeroemitamensajesdeaviso
y=zeros(size(x))
fori=1:n
y(i)=fzero(@(y)f(x(i),y),3,opt)
end
plot(x,y,'r')
ylim([03.1])
xlabel('d.d.p.V')
ylabel('Intensidad')
title('Fotovoltaica')
ObtenemosunarepresentacingrficasimilaralaobtenidaempleandolafuncinMATLABcontour.
Sistemasdeecuacionesnolineales
Calcularlasracesdelsistemadedosecuaciones:
f1(x,y)=2x2xy5x1=0
f2(x,y)=x+3log10xy2=0
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices_2.html
6/8
24/4/2015
EnlafiguravemoselpuntodeinterseccinymedianteTools/DataCursorsuscoordendasaproximadas..
x=linspace(2.5,5.5,50)
y1=(2*x.^25*x1)./x
y2=sqrt(x+3*log10(x))
plot(x,y1,'b',x,y2,'r')
VamosautilizarlafuncinfsolvedeMATLABparaobtenerelpuntodeinterseccin.
Enprimerlugar,tenemosquedefinirlafuncindenominadasis_ecuacionesyguardarlaenelcorrespondiente
fichero.M.Aestafuncinletenemosquepasarlosvaloresdexeyenelvectorxn,ynosdevuelvelosvaloresde
lasfuncionesf1(x,y)yf2(x,y)enelvectors.
functions=sis_ecuaciones(xn)
x=xn(1)
y=xn(2)
s=[2*x^2x*y5*x1,x*3*log10(x)y^2]
end
Creamoselscriptsis_ecuaciones_scriptparallamaralprocedimientonumricoimplementadoenlafuncin
fsolvedeMATLAB.
x0=[32]%valorinicial
[x,fval]=fsolve(@sis_ecuaciones,x0)
fprintf('Lasolucinesx=%1.3f,y=%1.3f\n',x(1),x(2))
fprintf('Valoresdelafuncin=%g\n',fval)
Afsolvetenemosquepasarlelafuncinquehemosdefinido,sis_ecuacionesylaaproximaxininicial(x0,y0)
quehemosencontradoanteriormentedeformagrfica.Estafuncinnosdevuelvelascoordenadas(x,y)delpunto
deinterseccinbuscadoylosvaloresdelasfuncionesf1(x,y)yf2(x,y)endichopunto.
Enlaventanadecomandoscorremoselscriptsis_ecuaciones_script
>>sis_ecuaciones_script
Lasolucinesx=3.958,y=2.664
Valoresdelafuncin=1.33692e010
Valoresdelafuncin=3.07305e009
EnergasRenovablesEUITIdeEibar
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices_2.html
7/8
24/4/2015
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices_2.html
8/8