Projekt i MATLAB
Hej!
Jag har jobbat med detta projekt jättelänge nu och känner att jag inte vet hur jag ska komplettera uppgiften, jag får rest hela tiden och det känns som att jag löser en sak men förstör en annan samtidigt.
Lärarens feedback på första delen:
Feedback
- Del 1: Du använder inte din funktion consumption och testar den inte. Funktionen finns där men i din kod för lottning används den inte. Tanken var ju också att ni skulle visa med några exempel att varför ni valde just spline och ingenting annat.
- Du använder heller inte funktionen velocity_routeX
Till uppgiften:
Del 1
Mitt Försök:
Min redovisning av Del 1
Tacksam för all hjälp!
Lottning eller plotting? :)
Läraren verkar undra varför du inte använder consumption(v) när du plottar.
Du kan ju plotta x mot consumption(x).
Dr. G skrev:Lottning eller plotting? :)
Ahahah, han älskar att stava fel :')
Läraren verkar undra varför du inte använder consumption(v) när du plottar.
Du kan ju plotta x mot consumption(x).
x= linspace (min(V), max(V))
Och y? Jag skrev y=consumption (x) men jag får Error. :((
Ok, vad för error?
Både spline() och ppval() är för mig svarta lådor, så jag vet inte riktigt vad de gör (men jag kan gissa).
Får du fel om du provar
comsumption(87.5)
?
Dr. G skrev:Ok, vad för error?
Både spline() och ppval() är för mig svarta lådor, så jag vet inte riktigt vad de gör (men jag kan gissa).
Får du fel om du provar
comsumption(87.5)
?
EDIT: i linje 11 har jag load('elbilTesla.mat') Syntax är i bilden.. Kommer verkligen inte ihåg så mycket.. 2 år sen jag gick kursen :/
mat-filen kan innehåll typ vad som helst.
Jag har ofta interpolerat med interp1, när jag inte har skrivit egna funktioner.
x=0:200
tt = 0:10:100;
int = interp1(x,V,xq);
plot(x,V,'o',tt,int,':.');
xlim([min(V) max(V)]);
Så? Jag känner att jag fortfarande inte använder funktionen:/ och mat-filen innehåller alla värden till V=speed_kmph;
och
E=consumption_Whpkm;
Jag är helt lost, då jag inte vet hur koden ska se ut nu med interpolation och inte spline.
Hej,
som du skriver så använder du ju inte funktionen. För att se om det är något fel i själva funktionen vore det bra om du kunde lägga in koden så man kan kopiera ut den och testa i MATLAB.
Koden
load elbilTesla.mat; %Värdena laddas in i elbilTesla.mat,
%för att skapa ett approximerat funktionsuttryck.
cs=spline(speed_kmph,consumption_Whpkm); %Approximationen skapas
c=ppval(cs,v); %Här beräknas värdet för hastigheten som givits
end
%Kod för plottningar i Command Window:
load('elbilTesla.mat')
V=speed_kmph;
E=consumption_Whpkm;
plot(V,E) %Här plottas anpassnignen
x=linspace(min(V), max(V));
y=spline(V,E);
hold on
plot(V,E,'*') %Här plottas datapunkterna
xlabel('Farten (km/h)')
ylabel('Konsumption (Wh/km)')
elbilTesla.mat filen innehåller detta:
speed_kmph innehåller värden 2 4 6 8 10... upp till 200.
consumption_Whpkm innehåller olika värden på consumptionen. Filerna är lika stora iaf.
Du fick inte med funktionen där.
Så!
function[c] = consumption(v)
%En funktionen som räknar elkonsumptionen vid en viss hastighet v.
%Värden är mellan 2 km/h - 200 km/h.
load elbilTesla.mat; %Värdena laddas in i elbilTesla.mat,
%för att skapa ett approximerat funktionsuttryck.
cs=spline(speed_kmph,consumption_Whpkm); %Approximationen skapas
c=ppval(cs,v); %Här beräknas värdet för hastigheten som givits
end
%Kod för plottningar i Command Window:
load('elbilTesla.mat')
V=speed_kmph;
E=consumption_Whpkm;
plot(V,E) %Här plottas anpassnignen
x=linspace(min(V), max(V));
y=spline(V,E);
hold on
plot(V,E,'*') %Här plottas datapunkterna
xlabel('Farten (km/h)')
ylabel('Konsumption (Wh/km)')
1) funktionen skall inte göra load på din .mat-fil igen, du skall ju skicka dit dina värden V och E för anpassning!
2) Du behöver skicka in värdet/värdena(en vektor) där du vill ha anpassningen
1), 2) => funktionshuvudet borde bli typ:
function c = consumption(V, E, v_fit)
* Klamrarna på c som du har i funktionshuvudet är onödiga när du bara skickar ut en utparameter
* Indentera din funktion
* Om du tittar i hjälptexten för spline verkar det vara en omväg att gå via polynom och ppval som du gör,
man kan göra YQ = spline(X,Y,XQ) och får då direkt de interpolerade värdena vid XQ. Men det kanske finns någon poäng med att göra det via ppval?
Jag har ändrat funktionen, men jag får dessa meddelanden :(, då går det inte att Indentera den.. Och borde jag ta bort rad 7?
Edit: Det står dock i uppgiften att funktionen ska ha inparameter v, inget annat :/
Kan du printa cs efter rad 7?
Då får jag ännu mer felmeddelande :/
Ok, om du inte får ha fler inparametrar får du väl göra load där. Men konstig funktion då, den går inte att ha till något annat.
Men en helt annan grej, jag tror inte du får blanda funktionsdefinition och scriptkod, dvs. du skall lägga funktionen i en egen fil och filen skall ha samma namn som funktionen (consumption).
Så gjorde jag iaf.
Ok, ta det från början.
Här är en enkel kod som interpolerar med spline.
x=[1:1:10]';
y = 2*x.^2 -exp(x/2);
xi=[1:.1:10]';
yi = spline(x,y,xi);
plot(x,y,'b*')
hold on
plot(xi,yi,'r-')
Gör likadant i din funktion . Strunta i ppval. Kalla cs för c.
@Matsmats, med "nya" matlab så kan man lägga funktioner i scriptfiler.
@Dr. G Ok, det låter som dålig praxis, men MathWorks har en massa konstiga idéer nuförtiden :).
@Soderstrom, hovra över det röda strecket ute i kanten, den röda fyrkanten talar om att din kod är felaktig.
Det röda strecket visar på vilken rad det är fel och när man hovrar över strecket ser man vad MATLAB inte gillar (testade din kod så jag tror jag vet vad MATLAB gnäller på).
En bra praxis är att sätta en brytpunkt på raden som går fel. Sedan kör man programmet fram till den raden och det är då lättare att begripa vad man gjort fel + att experimentera med hur man bör göra istället.
Dr. G skrev:Ok, ta det från början.
Här är en enkel kod som interpolerar med spline.
x=[1:1:10]';
y = 2*x.^2 -exp(x/2);
xi=[1:.1:10]';
yi = spline(x,y,xi);plot(x,y,'b*')
hold on
plot(xi,yi,'r-')Gör likadant i din funktion . Strunta i ppval. Kalla cs för c.
x=[2:2:200]';
y=consumption_Whpkm;
xi=[2:2:200]';
yi=spline(x,y,xi)
plot(x,y,'b*');
hold on
plot(xi,yi,'r-')
xlabel('Farten (km/h)')
ylabel('Konsumption (Wh/km)')
Typ så? Jag fattar nada typ :O,
Edit: Dessutom har jag fortfarande syntax fel i scriptet... Tog bort ppval dock. I (function c = consumption(V)) ska det vara stort V eller?
Din funktion ska interpolera värden från de två vektorerna som finns i .mat-filen.
I funktionen så ska du läs in mat-filen med load.
Det ger dig vektorerna speed_kmph och cosumption_Whpkm.
Sedan ska du interpolera med spline och returnera det värdet (eller vektor med värden).
Så ungefär
function c = consumption(v)
load(***.mat)
c = spline(speed_kmph,consumption_Whpkm,v);
end
Det är vad funktionen ska göra. c returneras. Plottandet kan du göra utanför funktionen.
Jag får iaf syntaxfel om jag blandar scriptkod och funktionskod. Jag kör R2020b så det är inte supergammalt.
T.ex. koden
function apa = bepa()
apa=5;
end
bepa
ger felutskriften "Error: File: bepa.m Line: 5 Column: 1
This statement is not inside any function.
(It follows the END that terminates the definition of the function "bepa".)
Det röda strecket i högerkanten sitter dessutom på motsvarande ställe som Soderstroms streck.
Så @Soderstrom, om det är det här felmeddelandet du ser så behöver du lägga ut consumption till en egen fil, som skall heta consumption.m (MATLAB går på filnamnet när man anropar funktioner)
Ok! Jag har flyttat på koden för plottning till ett annat ställe och "sparat" scriptfilen, men har fortfarande detta syntaxfel :(((
Edit: Jag anropar funktionen genom att först ladda ElbilTesla filen och sedan anropa genom tex: consumption(87.2) Jag fick:
Nu använder du inte v i funktionen, det är därför du har en varning (v är understruket) i editorn.
Kolla varningarna, de är bra tips.
I den form du anropar spline (2 parametrar) får du ut ett polynom som du kan använda ppval på (så som din funktion var skriven från början).
I Dr G:s form (3 parametrar) skickar du in v direkt.
Men jag vill bara göra så att jag kompletterar enligt feedbacken, jag vill helst inte ändra på koderna och scripten :(.
Ta tillbaka ppval som det var från början.
Ok! Hur menar läraren att jag ska testa och använda funktionen? Kommer jag få en plot eller bara värden?
function c = consumption(v)
%En funktionen som räknar elkonsumptionen vid en viss hastighet v.
%Värden är mellan 2 km/h - 200 km/h.
load elbilTesla.mat; %V¨ardena laddas in i elbilTesla.mat,
%f¨or att skapa ett approximerat funktionsuttryck.
cs=spline(speed_kmph,consumption_Whpkm); %Approximationen skapas
c=ppval(cs,v); %Här beräknas värdet för hastigheten som givits
end
Soderstrom skrev:Ok! Hur menar läraren att jag ska testa och använda funktionen? Kommer jag få en plot eller bara värden?
function c = consumption(v) %En funktionen som räknar elkonsumptionen vid en viss hastighet v. %Värden är mellan 2 km/h - 200 km/h. load elbilTesla.mat; %V¨ardena laddas in i elbilTesla.mat, %f¨or att skapa ett approximerat funktionsuttryck. cs=spline(speed_kmph,consumption_Whpkm); %Approximationen skapas c=ppval(cs,v); %Här beräknas värdet för hastigheten som givits end
Anropa nu funktionen i ett script eller i command window. Se till att funktionsfilen ligger i "rätt" katalog.
Testa t.ex att bara skriva
consumption(76.3)
Vad får du?
Jag anropade den två gånger till och med, ser ut att fungera
Ja, nu lirar det!
argumentet kan ju också vara en vektor, testa!
Yepp, verkar fungera det med :), vad är nästa steg? :o
Du är i princip klar med a).
Det sista stycket på frågan kan du t.ex lösa genom att lägga till en input-parameter som är .mat-filen.
Okej! Men läraren säger "Funktionen finns där men i din kod för lottning används den inte". Menar han att jag ska skriva "consumption(83.1) och "consumption(1:2:100)" i koden? Eller är det något som ska plottas utöver det som redan finns??
Det står väl inget i instruktionerna om någon plotting, men det är lätt gjort.
Skapa en vektor med lämpliga värden där hastigheten ska interpoleras fram, kanske
vel = [2:.1:200]';
Sedan för att få ut consumption för dessa hastigheter så anropar du din funktion.
cons = consumption(vel);
Nu kan du plotta
plot(vel,cons,'-')
Som det är gjort (med inläsning av .mat-filen i funktionen) så kommer du inte åt originaldatan i .mat-filen utanför funktionen.
En fullösning för detta är att interpolera på originalvärdena, om du vill plotta dem som *.
velOriginal = [2:1:200]';
plot(velOriginal,consumption(velOriginal),'*')
Matsmats skrev:Jag får iaf syntaxfel om jag blandar scriptkod och funktionskod. Jag kör R2020b så det är inte supergammalt.
T.ex. koden
function apa = bepa()
apa=5;
endbepa
ger felutskriften "Error: File: bepa.m Line: 5 Column: 1
This statement is not inside any function.
(It follows the END that terminates the definition of the function "bepa".)
Om scriptfilen och funktionen har samma namn så kan det nog bli problematiskt. Om filen skulle heta något annat än bepa.m så "ska" det fungera.
Jag fick följande plotar när jag använder koden (Som jag hade i början) och koden som Du skrev @Dr. G. Så jag tror att läraren var ute efter detta.
Men i hans feedback står det: "Tanken var ju också att ni skulle visa med några exempel att varför ni valde just spline och ingenting annat".
Jag skrev: "Jag valde ”spline” för att närr grad 1 − 6 av polynomanpassningen användes gav det ingen bra kurva som var bra och acceptabel." Räcker inte detta som motivering eller?
(Det är skillnad på att interpolera mellan mätpunkter och att göra en kurvanpassning till mätpunkter.)
Varför spline skulle vara mer "korrekt" än annan interpolation känns oklart. Prova kubisk interpolation och jämför med spline. Troligen blir skillnaden här liten, då det är tätt mellan mätpunkterna och det inte sker någon drastisk förändring mellan mätpunkterna. Spline kan annars ge mer "slängar" än kubisk interpolation, vilket är priset man får betala för att ha en kontinuerlig andraderivata (? tror jag).
Tydligen vill läraren att du ska ge "andra exempel" på varför du valde just spline.
Ska jag alltså motivera ytterligare, eller ska jag plota mer grafer för att visa skillnaden osv?
Svårt att veta vad det fiskas efter.
Om man antar att mätpunkterna är tillförlitliga så verkar det bra med interpolation. De ligger tätt och förbrukningen vid 79 km/h borde vara ungefär mittemellan förbrukningen vid 78 km/h och 80 km/h.
Varför spline skulle vara bättre än t.ex kubisk är oklart.
Jag använde polynomanpassning av grad 2 och 3 tillsammans med spline då. Som motivering till varför är Spline bäst här skrev jag:
Ska jag gå vidare tycker Ni??
Det är ju en lite lattjo jämförelse kan jag tycka. Polynomanpassningarna görs väl över hela intervallet, med alla mätpunkter, medan spline styckar upp i 99 intervaller. Man skulle ju fått väldigt liknande resultat genom att göra styckvis andra- eller tredjegradsanpassningar (eller t.o.m. linjärinterpolation).
För jag gissar att du gör polyfit på hela datasetet i andra- och tredjegradsfallet?
Matsmats skrev:Det är ju en lite lattjo jämförelse kan jag tycka. Polynomanpassningarna görs väl över hela intervallet, med alla mätpunkter, medan spline styckar upp i 99 intervaller. Man skulle ju fått väldigt liknande resultat genom att göra styckvis andra- eller tredjegradsanpassningar (eller t.o.m. linjärinterpolation).
För jag gissar att du gör polyfit på hela datasetet i andra- och tredjegradsfallet?
Ja, jag gör polyfit på hela datasetet i andra- och tredjegradsfallet. Är det fel?
Det är iaf inte riktigt jämförbart om du tänker efter. polyfit gör en minstakvadratanpassning över hela intervallet (ett enda intervall). Spline tar delintervall för delintervall (99 st) och kommer då att komma väldigt nära vad ögat tycker är bra.
Jämförelsen hade varit mer rättvis om du gjort t.ex. styckvis kvadratisk anpassning på tre intilliggande punkter.
Ser att man kan använda interp1 för att interpolera med varierande metoder (bl.a. spline).
Svårt att veta hur mycket resonemang kring detta som skall vara med.
Jag utgår ifrån Polyfit till en början. Tack så mycket för hjälpen <3