44 svar
204 visningar
Soderstrom Online 1678
Postad: 11 nov 21:03

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!

Dr. G Online 7381
Postad: 11 nov 22:44

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).

Soderstrom Online 1678
Postad: 11 nov 23:29 Redigerad: 11 nov 23:29
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.  :((

Dr. G Online 7381
Postad: 11 nov 23:34

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)

?

Soderstrom Online 1678
Postad: 11 nov 23:37 Redigerad: 11 nov 23:50
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 :/

Dr. G Online 7381
Postad: 11 nov 23:56

mat-filen kan innehåll typ vad som helst. 

Jag har ofta interpolerat med interp1, när jag inte har skrivit egna funktioner. 

Soderstrom Online 1678
Postad: 12 nov 00:16 Redigerad: 12 nov 00:31

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.

Soderstrom Online 1678
Postad: 12 nov 14:05

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.

Soderstrom Online 1678
Postad: 12 nov 14:27

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?

Soderstrom Online 1678
Postad: 12 nov 18:57 Redigerad: 12 nov 19:10

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 :/

Dr. G Online 7381
Postad: 12 nov 19:38

Kan du printa cs efter rad 7?

Soderstrom Online 1678
Postad: 12 nov 19:46

Då får jag ännu mer felmeddelande :/

Matsmats 261 – Live-hjälpare
Postad: 12 nov 20:22 Redigerad: 12 nov 20:23

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.

Dr. G Online 7381
Postad: 12 nov 20:23

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. 

Dr. G Online 7381
Postad: 12 nov 20:26

@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 :).

Matsmats 261 – Live-hjälpare
Postad: 12 nov 20:33 Redigerad: 12 nov 20:34

@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.

Soderstrom Online 1678
Postad: 12 nov 23:23 Redigerad: 12 nov 23:24
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? 

Dr. G Online 7381
Postad: 12 nov 23:43

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)

Soderstrom Online 1678
Postad: 13 nov 18:37 Redigerad: 13 nov 18:42

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.

Soderstrom Online 1678
Postad: 13 nov 19:01

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. 

Soderstrom Online 1678
Postad: 13 nov 20:54 Redigerad: 13 nov 20:54

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
Dr. G Online 7381
Postad: 13 nov 23:28
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?

Soderstrom Online 1678
Postad: 13 nov 23:43

Jag anropade den två gånger till och med, ser ut att fungera

Dr. G Online 7381
Postad: 13 nov 23:45

Ja, nu lirar det!

argumentet kan ju också vara en vektor, testa!

Soderstrom Online 1678
Postad: 13 nov 23:46

Yepp, verkar fungera det med :), vad är nästa steg? :o

Dr. G Online 7381
Postad: 14 nov 11:26

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. 

Soderstrom Online 1678
Postad: 14 nov 12:26 Redigerad: 14 nov 12:27

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??

Dr. G Online 7381
Postad: 14 nov 14:39

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),'*')

Dr. G Online 7381
Postad: 14 nov 14:47
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;
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".)

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. 

Soderstrom Online 1678
Postad: 14 nov 17:03

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?

Dr. G Online 7381
Postad: 14 nov 20:00

(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. 

Soderstrom Online 1678
Postad: 14 nov 20:56

Ska jag alltså motivera ytterligare, eller ska jag plota mer grafer för att visa skillnaden osv?

Dr. G Online 7381
Postad: 14 nov 23:13

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. 

Soderstrom Online 1678
Postad: 15 nov 16:38

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?

Soderstrom Online 1678
Postad: 15 nov 17:40 Redigerad: 15 nov 17:43
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.

Soderstrom Online 1678
Postad: 15 nov 18:06

Jag utgår ifrån Polyfit till en början. Tack så mycket för hjälpen <3

Svara Avbryt
Close