Borrar filtros
Borrar filtros

Warning: Error updating FunctionLine

6 visualizaciones (últimos 30 días)
Alicia Durian
Alicia Durian el 18 de Abr. de 2020
Comentada: Massimo Ciacci el 18 de Abr. de 2020
I want to create newtons interpolating polynomial with a matlab function and plot this at the end.
Following you can see the code. The polynomial I want to plot is saved in the variable p. (fplot)
If I want to plot it, I get the Warning: Error updating FunctionLine.
What am I doing wrong?
function [c] = Interpolieren(x,y,flag)
% Berechnung des Interpolationspolynoms
% P_n(x) = c0 + c1(x-x0)+c2(x-x0)(x-x1)+...+cn(x-x0)...(x-xn-1)
% x : x-Werte der Messreihe
% y : y-Werte der Messreihe
% P(x/y) sind die Stützstellen der Funktion
% flag = true Plot der Ergebnisse wird erzeugt
if nargin == 2 % Test ob 3. Übergabewert (für Plot) vorhanden ist
flag = false;
end
% Definieren von Variablen
l_2 = length(x); % Länge des x-Vektors
M = zeros(length(x),length(x)); % Definieren einer Matrix zum speichern der Koeffizienten
M(:,1) = y; % Der Matrix in der ersten Spalte die y-Werte zuweisen
c = zeros(length(x)); % Definieren des Vektors für die Koeffizienten
% Berechnung der Koeffizienten
for i_2 = 1:length(x)
l_2 = l_2-1;
for i_3 = 1:l_2
M(i_3,i_2+1) = (M(i_3+1,i_2)-M(i_3,i_2))/(x(i_3+i_2)-x(i_3));
end
end
c = M(1,:); % Koeffizienten im Vektor c speichern
% Definieren von Variablen
k=1; % Variable zur Speicherung der Klammern
d = 1; % Variable zur Speicherung der vorläufigen Funktion
c_i = ones(length(c)); % Vektor der Koeffizienten und Klammern des Polynoms enthält
for i_5 = 1:l_2
k = @(o) k * (o - x(i_5-1)); % Erstellen der Klammern der Funktion
c_i(i_5+1)= @(o) c(i_5+1) * k; % Erstellen der Klammern mit den Koeffizienten
end
for i_6 = 1:length(x) % Erstellen der Funktion ohne den ersten Koeffizenten
d = @(o) d + c_i(i_6);
end
p = @(o) c(1) + d % Erstellen der entgültigen Funktion
% Plotten der Stützstellen(P(x/y)) und des Polynoms
hold on
if flag == true
plot(x,y,'r*')
fplot(p,'b')
xlim([-5 5])
ylim([-5 5])
end
hold off
end
Thanks Alicia

Respuestas (3)

Massimo Ciacci
Massimo Ciacci el 18 de Abr. de 2020
Hello Alicia,
@ line 18 you change the for loop variable i_2 inside the loop, this is bad practice.
@ line 29 i_2 has the value 0, loop does not execute
You definition of function pointers (line 30,31,36) is rather cryptic (@(o) etc), I suppose this is the culprit of all the problems. I never saw this usage of function pointers. Should you use instead a default function definition ?
  3 comentarios
Massimo Ciacci
Massimo Ciacci el 18 de Abr. de 2020
Now you get that error because you are adding a function handle @(o) with a number c_i(i_6) which does not make sense. Just get rid of the @(o) altogether? If you are accumulating values you do not need @ stuff.
Alicia Durian
Alicia Durian el 18 de Abr. de 2020
But then I have an undefined variable 'o' in line 30. And I need this variable in the function at the end.

Iniciar sesión para comentar.


Massimo Ciacci
Massimo Ciacci el 18 de Abr. de 2020
function [c] = Interpolieren(x,y,flag)
% Berechnung des Interpolationspolynoms
% P_n(x) = c0 + c1 x + c2 x^2 + ... + c(n-1) x^(n-1)
% x : x-Werte der Messreihe
% y : y-Werte der Messreihe
% P(x/y) sind die Stützstellen der Funktion
% flag = true Plot der Ergebnisse wird erzeugt
if nargin == 2 % Test ob 3. Übergabewert (für Plot) vorhanden ist
flag = false;
end
% Definieren von Variablen
M = vanDerMondeMatrix(x);
if size(y,1)<size(y,2)
y = y.'; %make it a column vector
end
c = linsolve(M,y);
L = length(x);
clear('p');
p{1} = @(z) c(1);
for ii=2:L
p{ii} = @(z) (p{ii-1}(z) + c(ii).*z.^(ii-1));
%p{ii}(x(1))
end
% pFinal = @(z) arrayfun(@(k) p{1}(z), 1:L);
pFinal = p{L};
% Plotten der Stützstellen(P(x/y)) und des Polynoms
if flag == true
figure; hold on
plot(x,y,'r*')
xlim([x(1) x(end)])
fplot(pFinal,'b')
end
end
function M = vanDerMondeMatrix(x)
L = length(x);
if size(x,1)<size(x,2)
x = x.'; %make it a column vector
end
M = zeros(L,L);
for ii=1:L
M(:,ii) = x.^(ii-1);
end
end
  1 comentario
Massimo Ciacci
Massimo Ciacci el 18 de Abr. de 2020
You can copy paste the code above into an m file called Interpolieren.m

Iniciar sesión para comentar.


Tamir Gazit
Tamir Gazit el 18 de Abr. de 2020
try to set an intervel
fplot(@(x) exp(x),[-3 0],'b')
in your case fplot(p,[0 1])

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by