44 svar
382 visningar
Soderstrom behöver inte mer hjälp
Soderstrom 2768
Postad: 11 nov 2021 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 9479
Postad: 11 nov 2021 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 2768
Postad: 11 nov 2021 23:29 Redigerad: 11 nov 2021 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 9479
Postad: 11 nov 2021 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 2768
Postad: 11 nov 2021 23:37 Redigerad: 11 nov 2021 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 9479
Postad: 11 nov 2021 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 2768
Postad: 12 nov 2021 00:16 Redigerad: 12 nov 2021 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.

Matsmats 571 – Livehjälpare
Postad: 12 nov 2021 09:29

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 2768
Postad: 12 nov 2021 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.

Matsmats 571 – Livehjälpare
Postad: 12 nov 2021 14:24

Du fick inte med funktionen där.

Soderstrom 2768
Postad: 12 nov 2021 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)')

Matsmats 571 – Livehjälpare
Postad: 12 nov 2021 15:03

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 2768
Postad: 12 nov 2021 18:57 Redigerad: 12 nov 2021 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 9479
Postad: 12 nov 2021 19:38

Kan du printa cs efter rad 7?

Soderstrom 2768
Postad: 12 nov 2021 19:46

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

Matsmats 571 – Livehjälpare
Postad: 12 nov 2021 20:22 Redigerad: 12 nov 2021 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 9479
Postad: 12 nov 2021 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 9479
Postad: 12 nov 2021 20:26

@Matsmats, med "nya" matlab så kan man lägga funktioner i scriptfiler. 

Matsmats 571 – Livehjälpare
Postad: 12 nov 2021 20:27

@Dr. G Ok, det låter som dålig praxis, men MathWorks har en massa konstiga idéer nuförtiden :).

Matsmats 571 – Livehjälpare
Postad: 12 nov 2021 20:33 Redigerad: 12 nov 2021 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 2768
Postad: 12 nov 2021 23:23 Redigerad: 12 nov 2021 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 9479
Postad: 12 nov 2021 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. 

Matsmats 571 – Livehjälpare
Postad: 13 nov 2021 07:35

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 2768
Postad: 13 nov 2021 18:37 Redigerad: 13 nov 2021 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:

Matsmats 571 – Livehjälpare
Postad: 13 nov 2021 18:56

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 2768
Postad: 13 nov 2021 19:01

Men jag vill bara göra så att jag kompletterar enligt feedbacken, jag vill helst inte ändra på koderna och scripten :(. 

Matsmats 571 – Livehjälpare
Postad: 13 nov 2021 20:49

Ta tillbaka ppval som det var från början. 

Soderstrom 2768
Postad: 13 nov 2021 20:54 Redigerad: 13 nov 2021 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 9479
Postad: 13 nov 2021 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 2768
Postad: 13 nov 2021 23:43

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

Dr. G 9479
Postad: 13 nov 2021 23:45

Ja, nu lirar det!

argumentet kan ju också vara en vektor, testa!

Soderstrom 2768
Postad: 13 nov 2021 23:46

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

Dr. G 9479
Postad: 14 nov 2021 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 2768
Postad: 14 nov 2021 12:26 Redigerad: 14 nov 2021 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 9479
Postad: 14 nov 2021 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 9479
Postad: 14 nov 2021 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 2768
Postad: 14 nov 2021 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 9479
Postad: 14 nov 2021 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 2768
Postad: 14 nov 2021 20:56

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

Dr. G 9479
Postad: 14 nov 2021 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 2768
Postad: 15 nov 2021 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?? 

Matsmats 571 – Livehjälpare
Postad: 15 nov 2021 17:31

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 2768
Postad: 15 nov 2021 17:40 Redigerad: 15 nov 2021 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? 

Matsmats 571 – Livehjälpare
Postad: 15 nov 2021 18:04

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 2768
Postad: 15 nov 2021 18:06

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

Svara
Close