How to define a special function with some points
显示 更早的评论
I want to define a function like this
f(0.2)=1.42007;
f(0.4)=1.88124;
f(0.5)=2.12815;
f(0.6)=2.38676;
f(0.7)=2.65797;
f(0.8)=3.94289;
f(1)=3.55975;
to use these values in a For Loop. How can I define function f?
Thanks in advance.
采纳的回答
Ameer Hamza
2020-10-10
编辑:Ameer Hamza
2020-10-10
You can use interp1()
x = [0.2 0.4 0.5 0.6 0.7 0.8 1];
y = [1.42007 1.88124 2.12815 2.38676 2.65797 3.94289 3.55975];
f = @(xq) interp1(x, y, xq);
Then you can also evaluate in for in-between points
>> f(0.2)
ans =
1.4201
>> f(0.3)
ans =
1.6507
>> f(0.55)
ans =
2.2575
6 个评论
Thank you very much.
This is my code
clear all;
clc;
x = [0.2 0.4 0.5 0.6 0.7 0.8 1];
y = [1.42007 1.88124 2.12815 2.38676 2.65797 3.94289 3.55975];
f = @(xq) interp1(x, y, xq);
x = 0.6;
h = 0.4;
D(1,1) = (f(x + h) -2*f(x)+ f(x - h))/(h^2)
for i=1:2
h = h/2;
D(i + 1,1) = (f(x + h) -2*f(x)+ f(x - h))/(h^2);
for j=1:i
D(i + 1,j + 1) = (4^j*D(i + 1,j) - D(i,j))/(4^j - 1)
end
end
But the output is as follows
D =
NaN 0 0
26.2652 NaN 0
1.2600 -7.0751 NaN
Could you please tell me what the "NaN" is?
When I compute (f(x + h) -2*f(x)+ f(x - h))/(h^2) in Command Window separately, it equels to 1.2600, but actually D(1,1)=(f(x + h) -2*f(x)+ f(x - h))/(h^2) which is NaN.
clear all;
clc;
X = [0.2 0.4 0.5 0.6 0.7 0.8 1];
y = [1.42007 1.88124 2.12815 2.38676 2.65797 3.94289 3.55975];
f = @(xq) interp1(X, y, xq, 'linear', 'extrap');
x = 0.6;
h = 0.4;
f(x+h)
ans = 3.5598
f(x)
ans = 2.3868
x-h
ans = 0.2000
(x-h) - X(1)
ans = -5.5511e-17
f(x-h)
ans = 1.4201
D(1,1) = (f(x + h) -2*f(x)+ f(x - h))/(h^2)
D = 1.2894
for i=1:2
h = h/2;
D(i + 1,1) = (f(x + h) -2*f(x)+ f(x - h))/(h^2)
for j=1:i
D(i + 1,j + 1) = (4^j*D(i + 1,j) - D(i,j))/(4^j - 1)
end
end
D = 2×1
1.2894
26.2652
●
D = 2×2
1.2894 0
26.2652 34.5905
●
D = 3×2
1.2894 0
26.2652 34.5905
1.2600 0
●
D = 3×2
1.2894 0
26.2652 34.5905
1.2600 -7.0751
●
D = 3×3
1.2894 0 0
26.2652 34.5905 0
1.2600 -7.0751 -9.8528
●
If you look closely at this, you will see that 0.6 - 0.4 is not equal to 0.2 and instead is slightly less. Because of that, interp1() considered you to be doing extrapolation and the default extrapolation is NaN.
It happens when the input xq goes beyond the range of values in x. In your case, if xq is less than 0.2 or higher than 1.0, interp1 will give NaN. To avoid this, use extrapolation.
clear all;
clc;
x = [0.2 0.4 0.5 0.6 0.7 0.8 1];
y = [1.42007 1.88124 2.12815 2.38676 2.65797 3.94289 3.55975];
f = @(xq) interp1(x, y, xq, 'linear', 'extrap');
x = 0.6;
h = 0.4;
D(1,1) = (f(x + h) -2*f(x)+ f(x - h))/(h^2)
for i=1:2
h = h/2;
D(i + 1,1) = (f(x + h) -2*f(x)+ f(x - h))/(h^2);
for j=1:i
D(i + 1,j + 1) = (4^j*D(i + 1,j) - D(i,j))/(4^j - 1)
end
end
I understood. It works properly. Thank you so much for your consideration.
更多回答(0 个)
类别
在 帮助中心 和 File Exchange 中查找有关 Interpolation 的更多信息
标签
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
