Why is my cod not working?

조회 수: 2 (최근 30일)
Behrooz Daneshian
Behrooz Daneshian 2023년 1월 18일
댓글: Walter Roberson 2023년 1월 18일
I wrote an interpolation code to get parameter called "landa" by just having two input parameters called "Alpha" and "Mu" respectively. Plese find attached the graph for which I am doing such interpolation. First, I fitted 6 degree polynomial to each alpha curve(please note that the number shown on each curve is Alpha). The coefficients of all curves are saved in "Coefficient " matrix (this also has been attached here). I am wondering why the cod is not working for some cases(e.g. suppose that we have Alpha=2, and Mu=2. In this case the code does not enter to the defined if condition!). can anyone help me with this regard?
clear
close all
clc
load("Coefficient.mat")
Alpha=2;
Mu=2;
%%%%%% calculating landa based on the coefficient matrix
Alpha_vector=Coefficient(:,2)+Coefficient(:,3)*Mu+Coefficient(:,4)*(Mu^2)+Coefficient(:,5)*(Mu^3)+Coefficient(:,6)*(Mu^4)...
+Coefficient(:,7)*(Mu^5)+Coefficient(:,8)*(Mu^6);
%%%%%%% if Alpha is exactly equall to one of graph values.
if Alpha==Coefficient(1,1)
landa=Alpha_vector(1);
elseif Alpha==Coefficient(2,1)
landa=Alpha_vector(2);
elseif Alpha==Coefficient(3,1)
landa=Alpha_vector(3);
elseif Alpha==Coefficient(4,1)
landa=Alpha_vector(4);
elseif Alpha==Coefficient(5,1)
landa=Alpha_vector(5);
elseif Alpha==Coefficient(6,1)
landa=Alpha_vector(6);
elseif Alpha==Coefficient(7,1)
landa=Alpha_vector(7);
elseif Alpha==Coefficient(8,1)
landa=Alpha_vector(8);
elseif Alpha==Coefficient(9,1)
landa=Alpha_vector(9);
elseif Alpha==Coefficient(10,1)
landa=Alpha_vector(10);
elseif Alpha==Coefficient(11,1)
landa=Alpha_vector(11);
elseif Alpha==Coefficient(12,1)
landa=Alpha_vector(12);
elseif Alpha==Coefficient(13,1)
landa=Alpha_vector(13);
elseif Alpha==Coefficient(14,1)
landa=Alpha_vector(14);
elseif Alpha==Coefficient(15,1)
landa=Alpha_vector(15);
elseif Alpha==Coefficient(16,1)
landa=Alpha_vector(16);
elseif Alpha==Coefficient(17,1)
landa=Alpha_vector(17);
elseif Alpha==Coefficient(18,1)
landa=Alpha_vector(18);
elseif Alpha==Coefficient(19,1)
landa=Alpha_vector(19);
elseif Alpha==Coefficient(20,1)
landa=Alpha_vector(20);
elseif Alpha==Coefficient(21,1)
landa=Alpha_vector(21);
elseif Alpha==Coefficient(22,1)
landa=Alpha_vector(22);
elseif Alpha==Coefficient(23,1)
landa=Alpha_vector(23);
elseif Alpha==Coefficient(24,1)
landa=Alpha_vector(24);
elseif Alpha==Coefficient(25,1)
landa=Alpha_vector(25);
elseif Alpha==Coefficient(26,1)
landa=Alpha_vector(26);
%%%%%% if Alpha are not something we see on the graph
elseif Alpha>0 && Alpha<0.1
landa=Alpha_vector(1)-((Alpha-0)*(Alpha_vector(1)-Alpha_vector(2))/0.1);
elseif Alpha>0.1 && Alpha<0.2
landa=Alpha_vector(2)-((Alpha-0.1)*(Alpha_vector(2)-Alpha_vector(3))/0.1);
elseif Alpha>0.2 && Alpha<0.3
landa=Alpha_vector(3)-((Alpha-.2)*(Alpha_vector(3)-Alpha_vector(4))/0.1);
elseif Alpha>0.3 && Alpha<0.4
landa=Alpha_vector(4)-((Alpha-.3)*(Alpha_vector(4)-Alpha_vector(5))/0.1);
elseif Alpha>0.4 && Alpha<0.5
landa=Alpha_vector(5)-((Alpha-.4)*(Alpha_vector(5)-Alpha_vector(6))/0.1);
elseif Alpha>0.5 && Alpha<0.6
landa=Alpha_vector(6)-((Alpha-.5)*(Alpha_vector(6)-Alpha_vector(7))/0.1);
elseif Alpha>0.6 && Alpha<0.7
landa=Alpha_vector(7)-((Alpha-.6)*(Alpha_vector(7)-Alpha_vector(8))/0.1);
elseif Alpha>0.7 && Alpha<0.8
landa=Alpha_vector(8)-((Alpha-.7)*(Alpha_vector(8)-Alpha_vector(9))/0.1);
elseif Alpha>0.8 && Alpha<0.9
landa=Alpha_vector(9)-((Alpha-.8)*(Alpha_vector(9)-Alpha_vector(10))/0.1);
elseif Alpha>0.9 && Alpha<1
landa=Alpha_vector(10)-((Alpha-.9)*(Alpha_vector(10)-Alpha_vector(11))/0.1);
elseif Alpha>1 && Alpha<1.2
landa=Alpha_vector(11)-((Alpha-1)*(Alpha_vector(11)-Alpha_vector(12))/0.1);
elseif Alpha>1.2 && Alpha<1.4
landa=Alpha_vector(12)-((Alpha-1.2)*(Alpha_vector(12)-Alpha_vector(13))/0.1);
elseif Alpha>1.4 && Alpha<1.6
landa=Alpha_vector(13)-((Alpha-1.4)*(Alpha_vector(13)-Alpha_vector(14))/0.1);
elseif Alpha>1.6 && Alpha<1.8
landa=Alpha_vector(14)-((Alpha-1.6)*(Alpha_vector(14)-Alpha_vector(15))/0.1);
elseif Alpha>1.8 && Alpha<2
landa=Alpha_vector(15)-((Alpha-1.8)*(Alpha_vector(15)-Alpha_vector(16))/0.1);
elseif Alpha>2 && Alpha<2.5
landa=Alpha_vector(16)-((Alpha-2)*(Alpha_vector(16)-Alpha_vector(17))/0.1);
elseif Alpha>2.5 && Alpha<3
landa=Alpha_vector(17)-((Alpha-2.5)*(Alpha_vector(17)-Alpha_vector(18))/0.1);
elseif Alpha>3 && Alpha<3.5
landa=Alpha_vector(18)-((Alpha-3)*(Alpha_vector(18)-Alpha_vector(19))/0.1);
elseif Alpha>3.5 && Alpha<4
landa=Alpha_vector(19)-((Alpha-3.5)*(Alpha_vector(19)-Alpha_vector(20))/0.1);
elseif Alpha>4 && Alpha<4.5
landa=Alpha_vector(20)-((Alpha-4)*(Alpha_vector(20)-Alpha_vector(21))/0.1);
elseif Alpha>4.5 && Alpha<5
landa=Alpha_vector(21)-((Alpha-4.5)*(Alpha_vector(21)-Alpha_vector(22))/0.1);
elseif Alpha>5 && Alpha<5.5
landa=Alpha_vector(22)-((Alpha-5)*(Alpha_vector(22)-Alpha_vector(23))/0.1);
elseif Alpha>5.5 && Alpha<6
landa=Alpha_vector(23)-((Alpha-5.5)*(Alpha_vector(23)-Alpha_vector(24))/0.1);
elseif Alpha>6 && Alpha<7
landa=Alpha_vector(24)-((Alpha-6)*(Alpha_vector(24)-Alpha_vector(25))/0.1);
elseif Alpha>7 && Alpha<8
landa=Alpha_vector(25)-((Alpha-7)*(Alpha_vector(25)-Alpha_vector(26))/0.1);
end
  댓글 수: 2
Walter Roberson
Walter Roberson 2023년 1월 18일
I suggest you replace the whole
if Alpha==Coefficient(1,1)
chain with
[wasfound, idx] = ismember(Alpha, Coefficient(1:26,1));
if wasfound
landa = Alpha_vector(idx);
else
the other stuff
end
Walter Roberson
Walter Roberson 2023년 1월 18일
Your other code looks like it could be done with
interp1([0:0.1:1, 1.2:0.2:2, 2.5:0.5:6, 7, 8], Alpha_vector, Alpha)
or something similar.

댓글을 달려면 로그인하십시오.

답변 (1개)

Walter Roberson
Walter Roberson 2023년 1월 18일
elseif Alpha>1.4 && Alpha<1.6
landa=Alpha_vector(13)-((Alpha-1.4)*(Alpha_vector(13)-Alpha_vector(14))/0.1);
The division should not be by 0.1 each time; it should be by the difference between the endpoints of the interval.
I suspect you could do the whole thing with an interp1() call, all of the branches of both cases.
  댓글 수: 3
Behrooz Daneshian
Behrooz Daneshian 2023년 1월 18일
I figured out what to do regarding my previous question. Now I am wondering why Matlab does not accept that alpha(1) is not equal to Coefficient(11,1) which is 1.0000. Can you guide me in this regard?
Walter Roberson
Walter Roberson 2023년 1월 18일
Observe:
format long g
load Coefficient
Coefficient(1:10,1)
ans = 10×1
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
Coefficient(1:10,1) - (0:.1:.9).'
ans = 10×1
1.0e+00 * 0 0 0 0 0 0 0 0 -1.11022302462516e-16 -1.11022302462516e-16
(Coefficient(1:10,1) * 10 - (0:9).')/10
ans = 10×1
1.0e+00 * 0 0 0 4.44089209850063e-17 0 0 0 0 -8.88178419700125e-17 0
Coefficient(1:10,1) - (0:9).'/10
ans = 10×1
1.0e+00 * 0 0 0 5.55111512312578e-17 0 0 0 0 -1.11022302462516e-16 -1.11022302462516e-16
Different ways of calculating the 0, 0.1, 0.2, ... give different exact results -- and none of them match exactly what you have in your file.
num2hex(Coefficient([4,5,9,10],1))
ans = 4×16 char array
'3fd3333333333334' '3fd999999999999a' '3fe9999999999999' '3feccccccccccccc'
num2hex([0.3;0.4;0.8;0.9])
ans = 4×16 char array
'3fd3333333333333' '3fd999999999999a' '3fe999999999999a' '3feccccccccccccd'
lin = (0:9)/10;
num2hex(lin([4,5,9,10]))
ans = 4×16 char array
'3fd3333333333333' '3fd999999999999a' '3fe999999999999a' '3feccccccccccccd'
incr = (0:.1:.9).';
num2hex(incr([4,5,9,10]))
ans = 4×16 char array
'3fd3333333333334' '3fd999999999999a' '3fe999999999999a' '3feccccccccccccd'

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Line Plots에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by