28 svar
162 visningar
Soderstrom är nöjd med hjälpen
Soderstrom 2767
Postad: 15 nov 2021 17:37

Projekt i MATLAB (2)

Tack till @Dr. G och @Matsmats för hjälpen i föregående tråd!  Jag har fortfarande en del att jobba på!
Hur ska jag göra nu?

Feedback

-Du använder heller inte funktionen velocity_routeX

Del 1 b)

Mitt försök

Kommentar: Nedan finns Matlabfunktionen och koden för plottningarna i
figur 2 och 3. Jag valde ”spline” ¨aven för figur 2 och 3 för att splinefunktionen
anpassar en bra funktion till dessa spridda värdena.

function[v] = velocity_routeX(pos,speedX,distanceX)
%Funktionen r¨aknar hastigheten f¨or en given position f¨or en viss rutt.
%Rutten ges i form av tv˚a vektorer. En med ett antal distanser p˚a rutten
%och den andra med hastigheter f¨or distanserna.
sd = spline(distanceX,speedX); %H¨ar skapas ett approximerat funktionsuttryck
%f¨or v
v = ppval(sd,pos); %H¨ar ber¨aknas v f¨or given position
end
%Kod för rutt A plottningarna:
load('speed_routeA.mat')
load('speed_routeB.mat')
A=distanceA_km;
B=speedA_kmph;
plot(A,B) %Här plottas anpassnignen 
hold on
x=linspace(min(A),max(A));
y=spline(A,B,x)
plot(A,B,'*') %Här plottas datapunkterna
xlabel('Sträckan (km)')
ylabel('Farten (km/h)')

%Kod för rutt B plottningarna:
C=distanceB_km;
D=speedB_kmph;
plot(C,D) %Här plottas anpassnignen 
hold on
x=linspace(min(C),max(C));
y=spline(C,D,x);
plot(C,D,'r*') %Här plottas datapunkterna
xlabel('Sträckan (km)')
ylabel('Farten (km/h)')

Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 17:53

Du gör ju ungefär samma sak här som med den första funktionen.

Först skapar du en funktion, velocity_routeX men sedan använder du inte den när du gör plottningarna utan gör en ny spline-anpassning.

Soderstrom 2767
Postad: 15 nov 2021 18:03

Men då förstår jag inte vilka inparametrar jag ska ha vid plotningen :o

varden1 = speedA_kmph;
varden2=distanceA_km;

plot(varden,velocity_routeX(varden1,varden2, 0),'*')

typ så?? 

Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 18:07

Aha, nu ser jag ju att du inte ens använder dina framräknade värden.

1) du skall räkna fram y med funktionen

2) du skall plotta x och y, nu plottar du A och B resp. C och D två gånger men med olika 'kluttar' i plottarna

Soderstrom 2767
Postad: 15 nov 2021 18:16 Redigerad: 15 nov 2021 18:18

Jag har ju plotat y för båda ruttarna, A och B, eller va menar du? (Länge sen jag gjorde uppgiften)

Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 18:18

Kolla koden:

plot(C,D) %Här plottas anpassnignen

hold on x=linspace(min(C),max(C));

y=spline(C,D,x);

plot(C,D,'r*') %Här plottas datapunkterna

Soderstrom 2767
Postad: 15 nov 2021 18:29 Redigerad: 15 nov 2021 18:30

Sorry Matsmats, men hänger inte med riktigt, detta är ju koden för anpassningen, samt grafen för datan, hur använder jag detta i funktionen? Jag tänker att jag måste få en annan plot med hjälp av funktionen, men blir svårt med 3 inparametrar.

Jag får denna plot i alla fall när jag försöker med funktionen. Med kod:

 x=linspace(min(A),max(A));
 plot(x,velocity_routeX(x,speedA_kmph,A))

Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 18:33

Det ser bättre ut, nu använder du ju x och anpassningen till x.

I din tidigare kod plottade du C och D två gånger.

Soderstrom 2767
Postad: 15 nov 2021 18:41

Så eller? Jag fattar typ nada nu, Plotarna i "mitt försök" i huvudinlägget ska finnas med ellerhur? och nu måste jag bara få en plot med hjälp av funktionen (?)

 x=linspace(min(C),max(C));
plot(x, velocity_routeX(x,D,C))
Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 18:49

Ja, nånting sånt. Då plottar du ju de x-värden du valt och anpassat till.

 

Kolla din kod ovan, du gör plot(A,B), hold on, plot(A,B) utan att A och B ändras däremellan. Samma för C och D. Dina kommentarer säger dock något annat...

Soderstrom 2767
Postad: 15 nov 2021 19:21

Jag fick detta för RUTT A. 
Kod: nedan
Är det här vad läraren vill ha? Har jag använt funktionen (blå graf) rätt?

 A=distanceA_km;
B=speedA_kmph;
plot(A,B) %Här plottas anpassnignen
hold on
x=linspace(min(A),max(A));
y=spline(A,B,x);
plot(A,B,'*')
hold on
x=linspace(min(A),max(A));
>> plot(x, velocity_routeX(x,B,A),'b*')

Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 19:25 Redigerad: 15 nov 2021 19:28

Som innan, varför gör du plot(A,B) två gånger? Ta bort den andra plotten och kommentaren "Här plottas anpassningen" i den första plotten för det är ju dina datapunkter som plottas där.

Du gör ju också spline en gång utan att använda det, den görs ju senare i funktionen. Som jag sagt tidigare, titta i editorn, där har nog MATLAB strukit under och sagt att du inte använder variabeln y.

Sista plotten verkar ok tycker jag.

Soderstrom 2767
Postad: 15 nov 2021 19:32

Oj förlåt! Den här figuren räcker alltså? Med kod:

A=distanceA_km;
B=speedA_kmph;
x=linspace(min(A),max(A));
y=spline(A,B,x);
plot(A,B,'*')
hold on
x=linspace(min(A),max(A));
plot(x, velocity_routeX(x,B,A),'r*')

Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 19:42

Som sagt, titta i editorn... y används inte (och skall inte heller användas, spline finns ju inne i funktionen).

Jag hade nog själv tagit den anpassade kurvan (dvs velocity_routeX) som en linje snarare än prickar. Tanken är ju att den skall visa anpassningen till någon form av kurva.

Soderstrom 2767
Postad: 15 nov 2021 19:51

Såhär alltså? Om nej, då ger jag upp :( Är förvirrad och trött :/

 A=distanceA_km;
B=speedA_kmph;
>> plot(A,B)
>> hold on
>> x=linspace(min(A),max(A));
>> plot(x, velocity_routeX(x,B,A),'r*')

Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 19:54

Så menade jag, ja!

Soderstrom 2767
Postad: 15 nov 2021 19:55

OK! Den här figuren duger till Rutt A alltså? (ska lägga till namn på axlarna och gör samma sak för Rutt B). Är läraren nöjd nu?

Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 21:09

Lite svårt för mig att svara på... eller är jag läraren :)

Soderstrom 2767
Postad: 15 nov 2021 21:16 Redigerad: 15 nov 2021 21:30

Jag utgår ifrån att du är läraren :). Men med hänsyn till vad som står i uppgiften, vad tycker du?
Följande script och kod är till uppgift b), (jag får dock syntaxfel när jag anropar funktionen)...

function[v] = velocity_routeX(pos,speedX,distanceX)
%Funktionen räknar hastigheten för en given position för en viss rutt.
%Rutten ges i form av två vektorer. En med ett antal distanser på rutten
%och den andra med hastigheter för distanserna.
sd = spline(distanceX,speedX); %Här skapas ett approximerat funktionsuttryck
%för v
v = ppval(sd,pos); %Här beräknas v för given position
end
%RUTT A
A=distanceA_km;
B=speedA_kmph;
plot(A,B)
hold on
x=linspace(min(A),max(A));
plot(x, velocity_routeX(x,B,A),'r*')
xlabel('Sträckan (km)')
ylabel('Farten (km/h)')
%____________________________________
%RUTT B
C=distanceB_km;
D=speedB_kmph;
plot(C,D)
hold on
x=linspace(min(C),max(C));
plot(x, velocity_routeX(x,D,C),'r*')
xlabel('Sträckan (km)')
ylabel('Farten (km/h)')
Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 21:37

Vad står det i felmeddelandet?

Soderstrom 2767
Postad: 15 nov 2021 21:39

Matsmats 567 – Livehjälpare
Postad: 15 nov 2021 21:50

Precis som det står, de första två argumenten måste vara vektorer med minst två element.

Annars blir det svårt att interpolera...

Soderstrom 2767
Postad: 15 nov 2021 22:10

Hur? Jag fick inte till det när jag provar med två element.

Matsmats 567 – Livehjälpare
Postad: 16 nov 2021 08:35

Du testar ju med velocity_routeX(20,20,20). De första två '20' måste vara vektorer och lika långa, det är ju de som är grunden för interpolationen. Den sista skall ligga inuti intervallet för de två första. Det ser ut som det är rätt i den riktiga koden, där skickar du ju tre vektorer; x, D och C.

Soderstrom 2767
Postad: 16 nov 2021 10:04

Juste! velocity_routeX(x,D,C) fungerade bra i alla fall. Jag utgår från att detta är tillräckligt för uppgift 1 b).

Men en sista fråga bara, när jag plotar (A,B) så är det datapunkter jag plotar. Men vad kan man kalla ploten med stjärnor, en anpassning bara?  Ska ha "legend" med.

Matsmats 567 – Livehjälpare
Postad: 16 nov 2021 15:50

Det är de två sista till din funktion men de två första till chckxy. Läs felmeddelandena, det går nerifrån och upp.

Matsmats 567 – Livehjälpare
Postad: 16 nov 2021 17:02

Jag tror jag såg fel när jag svarade "Så menade jag, ja" förra gången.

Det bör vara typ plot(A,B,'*') och plot(x, velocity_routeX(x,D,C)).

Det är ju datapunkterna som man uppfattar som diskreta ('*') och anpassningen velocity_routeX som man uppfattar som "kontinuerlig" (sammanhängande linje). Eller vad tycker du?

Soderstrom 2767
Postad: 16 nov 2021 17:10

I så fall blir det ju plot(A,B,'*') och plot(x, velocity_routeX(x,B,A)) för Rutt A?

Soderstrom 2767
Postad: 17 nov 2021 18:10

Bump :((

Svara Avbryt
Close