大二数学物理方法之理想弦振动--matlab研究二阶偏微分方程

本人大二。数学物理方法课程作业分享,有错误请斧正,谢谢!

下面这张图在振幅上有问题,只作模式参考

 

 

这个是用matlab制作的弦振动演示动图,初速度随横轴的刻度成线性增大 

这个动图是初速度为零的情况 

理想弦振动的规律遵循波动方程,一种物理上常见的二阶偏微分方程。通常采用傅里叶分析将初始条件通过傅里叶级数以无数阶具有正弦函数形式的本征模式的线性叠加进行处理。在实际应用中取有限阶逼近。推荐阅读费曼物理学讲义和3b1b了解有关内容。以下为有关的摘录

部分操作代码在此

clc
clear
n=100;%计算级数1到100
v=10%要展示的级数
c=zeros(100)%描述初位移的一百级参数10*10
L=10;%弦长取值越大取点效果越好,但运算时间差很多
a=0.5;%波速
t=40%时间40刚好为一周期T=2L/a,即两倍弦长比上波速,原理可见费曼物理学讲义,
%可理解为一个小震动在两固定端不断被反射,一个来回就是一个周期
f=cell(v,1)%一行一级数据,共v行
第一种谐波分量算法
for n=1:100
fun1 = @(x) 3/10*L*x.*sin(n*pi*x/L)%由于给定初位移只允许sin模式的谐波存在,故不考虑cos项
fun2 = @(x) 3/20*L*(L-x).*sin(n*pi*x/L)%右半边乘以sin(n*pi*x/L)
fun3 = @(x) x.*sin(n*pi*x/L)%这个是初始速度的函数乘以sin(n*pi*x/L)
c(n) = 2/L*integral(fun1,0,L/3)+2/L*integral(fun2,L/3,L)%函数法求积分得参数,点乘!!!!
d(n) =-(1/pi)*integral(fun3,0,2*L/(a*n))
end
% 第二种谐波分量算法
% L=10;c=zeros(10)
% for n=1:100%数值法求每级系数,精度不高,时间长,吃算力,不推荐
%     for x=linspace(0,1/3*L,500)
%     c(n)=c(n)+3/10*L*x*sin(n*pi*x/L)*0.01
%     end
%     for x=linspace(1/3*L,L,1000)%加上0.01是为了避免重复
%         c(n)=c(n)+3/20*L*(L-x)*sin(n*pi*x/L)*0.01
%     end
% end
% 第三种谐波分量算法:复数形式的傅里叶系数取实数复数,由于本初始条件特殊,不列。


%%
hold on
for n=1:v
x=0:0.01:L
%figure(n)
f{n,1}=(c(n)*sin(n*pi/L*x))*cos(t*a*n*pi/L)+(d(n)*cos(t*a*n*pi/L))*sin(n*pi/L*x);%求出每一行所在级的一列初位移
subplot(2,5,n)
plot(x,f{n,1})%画出每一级的初位移分量
title(['Stage ',num2str(n)])
xlabel('length')
end
hold off
sum(numel(x))=0;
for i=1:numel(x)
    summ=0
    for j=1:v
        summ=summ+f{j,1}(i)
    end
    sum(i)=summ
end
figure(11)
plot(x,sum)
title(['time=',num2str(t),' stages added=',num2str(v)])

下面avi视频生成代码是在csdn找到的,感谢分享。与以上代码部分重复

%create files for string oscillation
clc
clear
n=100;%计算级数1到100
c=zeros(10)%描述初位移的一百级参数10*10
L=10;%弦长取值越大取点效果越好,但运算时间差很多
a=0.5;%波速
%t为时间
f=cell(n,1)%一行一级数据,共v行
% for n=1:100
% fun1 = @(x) 3/10*L*x.*sin(n*pi*x/L)%左半边
% fun2 = @(x) 3/20*L*(L-x).*sin(n*pi*x/L)%右半边
% fun3 = @(x) x.*sin(n*pi*x/L)%这个是初始速度的函数乘以sin(n*pi*x/L)
% c(n) = 2/L*integral(fun1,0,L/3)+2/L*integral(fun2,L/3,L)%函数法求积分得参数,点乘!!!!
% d(n) =2/(n*pi*a)*integral(fun3,0,L)
% end
for n=1:100
fun1 = @(x) 3/10*L*x.*sin(n*pi*x/L)%由于给定初位移只允许sin模式的谐波存在,故不考虑cos项
fun2 = @(x) 3/20*L*(L-x).*sin(n*pi*x/L)%右半边乘以sin(n*pi*x/L)
fun3 = @(x) x.*sin(n*pi*x/L)%这个是初始速度的函数乘以sin(n*pi*x/L)
c(n) = 2/L*integral(fun1,0,L/3)+2/L*integral(fun2,L/3,L)%函数法求积分得参数,点乘!!!!
d(n) =-(1/pi)*integral(fun3,0,2*L/(a*n))
end



%counter=0%为了配合avimaker的文件命名规则
% for t=0:40
%     counter=counter+1
%   for n=1:100
%   x=0:0.01:L
%   f{n,1}=c(n)*sin((n*pi)/L*x)*cos(t*a*n*pi/L)%求出每一行所在级的一列初位移
%   end
% sum(numel(x))=0;%sum为100级的叠加总位移
%   for i=1:numel(x)
%     summ=0
%       for j=1:100
%         summ=summ+f{j,1}(i)
%       end
%     sum(i)=summ
%   end
  %save .txt -ascii sum%生成sum向量的txt文件在系统路径 //eval(['save ','stringmov',num2str(counter) '.txt sum -ASCII -double'])%生成文件名
  %eval(['save ','stringmov',num2str(counter) '.txt sum -ASCII '])%生成文件名
%end
t = 0:40;   % 设置间隔
% 设置保存对象
aviobj = VideoWriter('stringmov2.avi');   % 创建一个名为***.avi的AVI文件
aviobj.FrameRate = 8;   % 画图的帧率,越大表示越快10
open(aviobj);   % 打开AVI文件

for t=0:40
    
    for n=1:100
        x=0:0.01:L
        f{n,1}=sin(n*pi/L*x)*(c(n)*cos(t*a*n*pi/L)+d(n)*sin(t*a*n*pi/L))%求出每一行所在级的一列初位移
    end
    sum(numel(x))=0;%sum为100级的叠加总位移
    for i=1:numel(x)
        summ=0
        for j=1:100
            summ=summ+f{j,1}(i)
        end
        sum(i)=summ
    end
    plot(x,sum)
    ylim([-50 50])
    title(['time=',num2str(t)])
    xlabel('x')
    ylabel('u')
    CurrFrame = getframe;   % 获取每帧图片
    writeVideo(aviobj, CurrFrame);   % 写入AVI文件中
end
% 关闭AVI文件
close(aviobj);

 

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MATLAB可以用多种方法进行二元二阶偏微分方程组的求解。其中,一种方法是使用边值问题求解函数BVP4C,这个函数可以帮助我们求解一般形式的边值问题,但可能相对繁琐。另一种方法是使用1stOpt函数,这个函数对求解偏微分方程组非常简单和快捷。具体的代码实现可以参考引用中的示例。 另外,根据引用中给出的ODEFunction,我们可以使用MATLAB的ODE求解器来解决二元二阶偏微分方程组。在这个函数中,x'表示x的一阶导数,而x、y分别表示方程组中的两个未知函数。您可以根据具体的方程组形式将其代入ODEFunction中,并使用MATLAB的ODE求解器进行求解。 综上所述,MATLAB提供了多种方法求解二元二阶偏微分方程组,包括使用BVP4C函数、1stOpt函数以及ODE求解器。具体使用哪种方法取决于您的需求和方程组的形式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Matlab基础应用学习笔记.md](https://download.csdn.net/download/weixin_52057528/88284511)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [求助,matlab求解二元二阶的常微分方程组](https://blog.csdn.net/weixin_39817176/article/details/115900918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值