高斯勒让德求积公式matlab通用程序,数值分析——Gauss-Legendre求积 ...

⾼斯勒让德求积公式matlab通⽤程序,数值分析——Gauss-
Legendre求积分(M。。。
2020 4.4
题⽬:编写Gauss求积法计算积分的程序(Gauss点数取1,2,3,4,5即可)并⽤于计算积分
∫10sinxxdx∫01sin x xdx\int_{0}^{1} \frac{\sin x}{x} d x∫01x sinx d x
部分⾼斯-勒让德求积公式的结点和求积系数:
n012xk0±0.5773502692±0.77459666920Ak210.55555555550.8888888888n34xk±0.8611363116±0.3399810436±{ccc||ccc}\hline n & x_{k} & A_{k} & n & x_{k} & A_{k} \\\hline 0 & 0 & 2 & 3 & \pm 0.8611363116 & 0.3478548451 \\1
& \pm 0.5773502692 & 1 & &\pm 0.3399810436 & 0.6521451549 \\2 & \pm 0.7745966692 & 0.5555555555 & 4 &
\pm 0.9061798459 & 0.2369268851 \\& 0 & 0.8888888888 & & \pm 0.5384693101 & 0.4786286705 \\& & & &0&
0.568888889 \\\hline\end{array}n012x k0±0.5773502692±0.77459666920A k210.55555555550.8888888888n34x k
±0.8611363116±0.3399810436±0.9061798459±0.53846931010A k
通用积分0.34785484510.65214515490.23692688510.47862867050.568888889
区间变换与函数变换:
区间[a,b]->[-1,1]:
x=12(a+b)+12(b−a)tx=12(a+b)+12(b−a)tx=\frac{1}{2}(a+b)+\frac{1}{2}(b-a) tx=21(a+b)+21(b−a)t
函数变换:
∫baf(x)dx=b−a2∫1−1f[12(a+b)+12(b−a)t]dt∫abf(x)dx=b−a2∫−11f[12(a+b)+12(b−a)t]dt\int_{a}^{b} f(x) \mathrm{d}
x=\frac{b-a}{2} \int_{-1}^{1} f\left[\frac{1}{2}(a+b)+\frac{1}{2}(b-a) t\right] \mathrm{d} t∫ab f(x)dx=2b−a∫
−11f[21
(a+b)+21(b−a)t]dt
具体实现
function [f1,I] = GaussInt(f,a,b,n)
%该函数利⽤Gauss-Lagendre求积公式计算积分
%依次输⼊函数,左右区间端点,和结点个数进⾏计算⾼斯积分
syms t
f1=subs(f,symvar(f),(b-a)/2+(b-a)*t/2)*(b-a)/2;
switch n %分别代表不同结点个数时的Gauss积分
case 1
I=eval(2*subs(f1,symvar(f1),0));
case 2
I=eval(subs(f1,symvar(f1),0.5773503))+...
eval(subs(f1,symvar(f1),-0.5773503));
case 3
I=0.5555555555*eval(subs(f1,symvar(f1),0.7745966692))+...
0.5555555555*eval(subs(f1,symvar(f1),-0.7745966692))+...
0.8888888888*eval(subs(f1,symvar(f1),0));
case 4
I=0.3478548451*eval(subs(f1,symvar(f1),0.8611363116))+...
0.3478548451*eval(subs(f1,symvar(f1),-0.8611363116))+...
0.6521451549*eval(subs(f1,symvar(f1),0.3399810436))+...
0.6521451549*eval(subs(f1,symvar(f1),-0.3399810436)); case 5
I=0.2369268851*eval(subs(f1,symvar(f1),0.9061798459))+...
0.2369268851*eval(subs(f1,symvar(f1),-0.9061798459))+...
0.4786286705*eval(subs(f1,symvar(f1),0.5384693101))+...
0.4786286705*eval(subs(f1,symvar(f1),-0.5384693101))+...
0.568888889*eval(subs(f1,symvar(f1),0));
end
踩坑⽇志
错误:
>> [F,I]=GaussInt(sin(x)/x, 0, 1,1)
数组索引必须为正整数或逻辑值。
发热板
出错 sym/subsref (line 870)
R_tilde = builtin('subsref',L_tilde,Idx);
原因:
I=2*f1(0);
应该f1是⼀个符号表达式⽽不是⼀个函数
错误:
>> [F,I]=GaussInt(sin(x)/x, 0, 1,1)
未定义函数或变量 'x'。
出错 GaussInt (line 5)
f1=subs(f,x,(b-a)/2+(b-a)*t/2)*(b-a)/2;
原因:
syms x
集滤器所编写的函数中没有定义变量x
改进:
f1=subs(f,symvar(f),(b-a)/2+(b-a)*t/2)*(b-a)/2;
这样可以不⽤声明变量
学到的matlab语法
matlab代码注释
快速:
Ctrl +t
Ctrl+ r
switch多分⽀结构
switch n %分别代表不同结点个数时的Gauss积分
case 1
I=eval(2*subs(f1,symvar(f1),0));
case 2
I=eval(subs(f1,symvar(f1),0.5773503))+...
eval(subs(f1,symvar(f1),-0.5773503));
case 3
I=0.5555555555*eval(subs(f1,symvar(f1),0.7745966692))+...
0.5555555555*eval(subs(f1,symvar(f1),-0.7745966692))+...
0.8888888888*eval(subs(f1,symvar(f1),0));
case 4
I=0.3478548451*eval(subs(f1,symvar(f1),0.8611363116))+...
0.3478548451*eval(subs(f1,symvar(f1),-0.8611363116))+...
0.6521451549*eval(subs(f1,symvar(f1),0.3399810436))+...
0.6521451549*eval(subs(f1,symvar(f1),-0.3399810436));
case 5
I=0.2369268851*eval(subs(f1,symvar(f1),0.9061798459))+...
0.2369268851*eval(subs(f1,symvar(f1),-0.9061798459))+...
0.4786286705*eval(subs(f1,symvar(f1),0.5384693101))+...
0.4786286705*eval(subs(f1,symvar(f1),-0.5384693101))+...
0.568888889*eval(subs(f1,symvar(f1),0));
otherwise
disp("结点数为1-5")
end
matlab函数的编写
在MATLAB中,函数定义在单独的⽂件。⽂件函数的⽂件名应该是相同的。函数可以接受多个输⼊参数和可能返回多个输出参数。
函数语句的语法是:
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
建⽴函数⽂件,命名为 mymax.m并输⼊下⾯的代码:
function max = mymax(n1, n2, n3, n4, n5)
%This function calculates the maximum of the
% five numbers given as input
max = n1;
if(n2 > max)
max = n2;
end
if(n3 > max)
max = n3;
end
if(n4 > max)sma天线
max = n4;
end
if(n5 > max)
max = n5;
end
每个函数的第⼀⾏要以 function 关键字开始。它给出了函数的名称和参数的顺序。在我们的例⼦中,mymax 函数有5个输⼊参数和⼀个输出参数。
注释⾏语句的功能后提供的帮助⽂本。这些线条打印,当输⼊:
help mymax
MATLAB执⾏上述语句,返回以下结果:
This function calculates the maximum of the
five numbers given as input
可以调⽤该函数:
mymax(34, 78, 89, 23, 11)
MATLAB执⾏上述语句,返回以下结果:
ans =
89
注:如果要输出多个返回值:
>> [F,I]=GaussInt(sin(x)/x, 0, 1,2)
F =
sin(t/2 + 1/2)/(2*(t/2 + 1/2))
z轴线性马达0.946041135536224
⼀种matlab的数据类型能够存储变长的⼀维向量:
刚开始想把结点和系数存储起来⽤循环进⾏对应的遍历A=[1,2,3,4];
电解离子接地棒
B=[5];
C=[6,7];
p={A,B,C}
以下运⾏结果:
>> p{1}(1,2)
ans =
2
元胞数组

本文发布于:2024-09-22 03:33:46,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/340095.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   结点   参数   语句   求积   返回   变长
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议