Warning: Error updating FunctionLine

23 ビュー (過去 30 日間)
Alicia Durian
Alicia Durian 2020 年 4 月 18 日
コメント済み: Massimo Ciacci 2020 年 4 月 18 日
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

回答 (3 件)

Massimo Ciacci
Massimo Ciacci 2020 年 4 月 18 日
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 件のコメント
Massimo Ciacci
Massimo Ciacci 2020 年 4 月 18 日
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 2020 年 4 月 18 日
But then I have an undefined variable 'o' in line 30. And I need this variable in the function at the end.

サインインしてコメントする。


Massimo Ciacci
Massimo Ciacci 2020 年 4 月 18 日
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 件のコメント
Massimo Ciacci
Massimo Ciacci 2020 年 4 月 18 日
You can copy paste the code above into an m file called Interpolieren.m

サインインしてコメントする。


Tamir Gazit
Tamir Gazit 2020 年 4 月 18 日
try to set an intervel
fplot(@(x) exp(x),[-3 0],'b')
in your case fplot(p,[0 1])

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by