matlab:有限差分求解纳维尔(Navier)边界的双调和(Biharmonic)方程,边值为零

news2024/11/28 0:56:23

我们考虑如下形式的双调和方程的数值解
在这里插入图片描述
其中,Ω是欧氏空间中的多边形或多面体域,在其中,d为维度,具有分段利普希茨边界,满足内部锥条件,f(x) ∈ L2(Ω)是给定的函数,∆是标准的拉普拉斯算子。算子∆u(x)和∆2u(x)表示为
在这里插入图片描述

巧妙地将双调和方程(1.1)分解为两个Possion方程,传统的数值方法如有限元法(FEM)和有限差分法(FDM)在计算资源和时间复杂度较小的情况下表现良好。通过引入辅助变量w = −∆u,可以将四阶方程(1.1)重写为一对二阶方程:
在这里插入图片描述
或者引入变量w = ∆u,得到
在这里插入图片描述
那么,我们的目标为寻找一对函数(w,u),而不是找到原始问题(1.1)的解。如下我们以g=0和h=0为例,利用五点中心差分求解上面的双调和方程。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%          Matrix method for Biharmonic Equation      %%%%
%%%     u_{xxxx} + u_{yyyy} + 2*u_{xx}*u_{yy} = f(x, y)  %%%%
%%%           Omega = 0 < x < 1, 0 < y < 1               %%%%
%%%              u(x, y) = 0 on boundary,                %%%%  
%%%  Exact soln: u(x, y) = sin(pi*x)*sin(pi*y)           %%%%
%%%        Here f(x, y) = 4*pi^4*sin(pi*x)*sin(pi*y);   %%%%
%%%        Course:    Ye Xiao Lan on 04.01 2024         %%%% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all
clc
close all

ftsz = 20;

x_l = -1.0;
x_r = 1.0;
y_b = -1.0;
y_t = 1.0;

q = 6;
Num = 2^q+1;
NNN = Num*Num;

point_num2x = Num;
point_num2y = Num;

fside = @(x, y) 4*pi^4*sin(pi*x).*sin(pi*y);
utrue = @(x, y) sin(pi*x).*sin(pi*y);

hx = (x_r-x_l)/point_num2x; 
X = zeros(point_num2x-1,1);
for i=1:point_num2x-1
  X(i) = x_l+i*hx;
end

hy = (y_t-y_b)/point_num2y; 
Y=zeros(point_num2y-1,1);
for i=1:point_num2y-1
  Y(i) = y_b+i*hy;
end
[meshX, meshY] = meshgrid(X, Y);

tic;
Unumberi = FDM2Biharmonic_Couple2Navier_Zero(point_num2x, point_num2y,...
                                                x_l, x_r, y_b, y_t, fside);
fprintf('%s%s%s\n','运行时间:',toc,'s')
U_exact = utrue(meshX, meshY);
meshErr = abs(U_exact - Unumberi);

rel_err = sum(sum(meshErr))/sum(sum(abs(U_exact)));
fprintf('%s%s\n','相对误差:',rel_err)

figure('name','Exact')
axis tight;
h = surf(meshX, meshY, U_exact','Edgecolor', 'none');
hold on
title('Exact Solu')
% xlabel('$x$', 'Fontsize', 20, 'Interpreter', 'latex')
% ylabel('$y$', 'Fontsize', 20, 'Interpreter', 'latex')
% zlabel('$Error$', 'Fontsize', 20, 'Interpreter', 'latex')
hold on
set(gca, 'XMinortick', 'off', 'YMinorTick', 'off', 'Fontsize', ftsz);
set(gcf, 'Renderer', 'zbuffer');
hold on
% colorbar;
% caxis([0 0.00012])
hold on

figure('name','Absolute Error')
axis tight;
h = surf(meshX, meshY, meshErr','Edgecolor', 'none');
hold on
title('Absolute Error')
% xlabel('$x$', 'Fontsize', 20, 'Interpreter', 'latex')
% ylabel('$y$', 'Fontsize', 20, 'Interpreter', 'latex')
% zlabel('$Error$', 'Fontsize', 20, 'Interpreter', 'latex')
hold on
set(gca, 'XMinortick', 'off', 'YMinorTick', 'off', 'Fontsize', ftsz);
set(gcf, 'Renderer', 'zbuffer');
hold on
% colorbar;
% caxis([0 0.00012])
hold on

if q==6
    txt2result = 'result2fdm_mesh6.txt';
elseif q==7
    txt2result = 'result2fdm_mesh7.txt';
elseif q==8
    txt2result = 'result2fdm_mesh8.txt';
elseif q==9
    txt2result = 'result2fdm_mesh9.txt';
end

fop = fopen(txt2result, 'wt');

fprintf(fop,'%s%s%s\n','运行时间:',toc,'s');
fprintf(fop,'%s%d\n','内部网格点数目:',Num-1);
fprintf(fop,'%s%s\n','相对误差:',rel_err);

被调用的求解函数如下:

function Uapp = FDM2Biharmonic_Couple2Navier_Zero(Nx, Ny, xleft, xright, ybottom, ytop, fside)
    format long;

    % Define the step sizes and create the grid without boundary points
    hx = (xright-xleft)/Nx; 
    x = zeros(Nx-1,1);
    for ix=1:Nx-1
      x(ix) = xleft+ix*hx;
    end

    hy = (ytop-ybottom)/Ny; 
    y=zeros(Ny-1,1);
    for iy=1:Ny-1
      y(iy) = ybottom+iy*hy;
    end

    % Define the source term
    source_term = fside;

    % Initialize the coefficient matrix A and the right-hand side vector F
    N = (Ny-1)*(Nx-1);
    A = sparse(N,N); 
    FV = zeros(N,1);

    % Loop through each inner grid point, Apply finite difference scheme (central differences)
    hx1 = hx*hx; 
    hy1 = hy*hy; 
    for jv = 1:Ny-1
      for iv=1:Nx-1
        kv = iv + (jv-1)*(Nx-1);
        FV(kv) = fside(x(iv),y(jv));
        A(kv,kv) = -2/hx1 -2/hy1;
        
        %-- x direction --------------
        if iv == 1
            A(kv,kv+1) = 1/hx1;
        else
           if iv==Nx-1
             A(kv,kv-1) = 1/hx1;
           else
            A(kv,kv-1) = 1/hx1;
            A(kv,kv+1) = 1/hx1;
           end
        end
        %-- y direction --------------
        if jv == 1
            A(kv,kv+Nx-1) = 1/hy1;
        else
           if jv==Ny-1
             A(kv,kv-(Nx-1)) = 1/hy1;
           else
              A(kv,kv-(Nx-1)) = 1/hy1;
              A(kv,kv+Nx-1) = 1/hy1;
           end
        end
      end
    end
    V = A\FV;

    B = sparse(N,N); 
    FU = zeros(N,1);

    % Loop through each inner grid point, Apply finite difference scheme (central differences)
    for ju = 1:Ny-1
      for iu=1:Nx-1
        ku = iu + (ju-1)*(Nx-1);
        FV(ku) = V(ku);
        B(ku,ku) = -2/hx1 -2/hy1;
        
        %-- x direction --------------
        if iu == 1
            B(ku,ku+1) = 1/hx1;
        else
           if iu==Nx-1
             B(ku,ku-1) = 1/hx1;
           else
            B(ku,ku-1) = 1/hx1;
            B(ku,ku+1) = 1/hx1;
           end
        end
        %-- y direction --------------
        if ju == 1
            B(ku,ku+Nx-1) = 1/hy1;
        else
           if ju==Ny-1
             B(ku,ku-(Nx-1)) = 1/hy1;
           else
              B(ku,ku-(Nx-1)) = 1/hy1;
              B(ku,ku+Nx-1) = 1/hy1;
           end
        end
      end
    end
    
    U = B\FV;
    %--- Transform back to (i,j) form to plot the solution ---
    j = 1;
    for k=1:N
      i = k - (j-1)*(Nx-1) ;
      Uapp(i,j) = U(k);
      j = fix(k/(Nx-1)) + 1;
    end
end

结果如下:
运行时间:6.574370e-02s
相对误差:1.558669e-03
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1582008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM规范中的运行时数据区

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

YOLOv9改进策略 :卷积魔改 | 变形条状卷积,魔改DCNv3二次创新

💡💡💡本文独家改进: 变形条状卷积,DCNv3改进版本,不降低精度的前提下相比较DCNv3大幅度运算速度 💡💡💡强烈推荐:先到先得,paper级创新,直接使用; 💡💡💡创新点:1)去掉DCNv3中的Mask;2)空间域上的双线性插值转改为轴上的线性插值; 💡💡💡…

QT windeployqt打包出现无法正常启动问题

QT 通过windeployqt 打包后出现的问题 原因QT构建选择的是64位的 但是windows下运行的却是32位的 步骤打开32的所在路径 一般在上一级目录会有安装好的64位的MSVC工具 运行打包即可

装饰建材商城网满足家装行业需求,改变传统装修市场

装饰建材商城网满足家装行业需求&#xff0c;改变传统装修市场 随着国内楼市的火爆发展&#xff0c;家装行业可谓是炙手可热。人们关于家装的需求也开始从过去简单的宜居&#xff0c;开始向多元化需求转变&#xff0c;如环保、健康、安全、绿色、时尚等等。加上互联网的快速发展…

电能质量测试仪的功能特点

武汉凯迪正大电能质量测试仪功能特点 1、多通道测量&#xff1a;4个电压通道、4个电流通道同时测量。 2、电气参数测量&#xff1a;可同时测量电压幅值、电流幅值、相位、频率、有功功率、无功功率、功率因数等参数&#xff1b; 3、可测量2-64次的电压谐波和电流谐波含量&am…

C语言:指针详解(1)

目录 一、内存和地址 1.内存 2.究竟该如何理解编址 二、指针变量和地址 1.取地址操作符(&) 2.解引用操作符(*) 3.指针变量的大小 三、指针变量类型的意义 1.指针的解引用 2.指针-整数 3.void*指针 四、const修饰指针 1.const修饰变量 2.const修饰指针变量 五…

【计算机毕业设计】企业仓储管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

如何利用在线仿真软件提高教学质量?

在教育技术迅速发展的今天&#xff0c;老师们面临着一个共同的挑战&#xff1a;如何有效地利用新兴技术提高教学质量。特别是在科学、技术、工程和数学&#xff08;STEM&#xff09;教育领域&#xff0c;实践性和互动性是学习过程中不可或缺的元素。本文将深入探讨在线仿真软件…

[大模型]ChatGLM3-6B Code Interpreter

ChatGLM3-6B Code Interpreter 请注意&#xff0c;本项目需要 Python 3.10 或更高版本。 环境准备 由于项目需要python 3.10或更高版本&#xff0c;所以我们在在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择Miniconda–>conda3–>3.10(ubu…

护眼灯值不值得买?收获好评最多的护眼灯十大品牌推荐

如今&#xff0c;我们可以清晰地观察到越来越多的人很早就戴上眼镜的现象。这可能是由于频繁接触电子产品&#xff0c;长时间的学习&#xff0c;或处于不良的光线环境下造成的。不论原因何在&#xff0c;我们都意识到创造良好的光线环境对保护视力至关重要。尽管一些人对市面上…

springboot3使用自定义注解+AOP+redis优雅实现防重复提交

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 实现思路 实现步骤 1.定义防重复提交注解 2.编写一个切面去发现该注解然后执行防重复提交逻辑 3.测试 …

Spring Cloud系列(二):Eureka Server应用

系列文章 Spring Cloud系列(一)&#xff1a;Spirng Cloud变化 Spring Cloud系列(二)&#xff1a;Eureka Server应用 目录 前言 注册中心对比 Nacos Zookeeper Consul 搭建服务 准备 搭建 搭建父模块 搭建Server模块 启动服务 测试 其他 前言 前面针对新版本的变化有了…

【SCI绘图】【曲线图系列1 python】绘制扫描点平滑曲线图

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【曲线图1 python】绘制扫描点平滑曲线图 1.环境准备 python 3 import numpy as np import pandas as pd import proplot …

镗床工作台开槽的作用

镗床工作台开槽的作用主要有以下几点&#xff1a; 改善工作台的刚度和稳定性&#xff1a;开槽可以增加工作台的刚度&#xff0c;使其能够承受更大的切削力和振动力&#xff0c;提高工作台的稳定性。 方便工件夹紧和定位&#xff1a;开槽可用于夹紧和定位工件&#xff0c;使其能…

SAP 配置不让采购发票重复<转载>

原文链接&#xff1a;https://www.doc88.com/p-74459799460659.html 此配置方案存在一些弊端&#xff0c; 1.比如如果录入错误发票号就检验不到重复&#xff0c;还有录入字符限制最多16个字符等等。 2.设置后对于发票预制和正式发票都同时生效的&#xff0c;而有…

WEB3浪潮下的全新体验:精灵派对链游引领边玩边赚的创新之旅

在当前的数字经济浪潮中&#xff0c;区块链技术以其独特的去中心化特性&#xff0c;正在逐渐改变我们的生活和工作方式。其中&#xff0c;区块链游戏&#xff08;链游&#xff09;作为新兴的领域&#xff0c;正以其独特的优势吸引着全球玩家的目光。在这样一个背景下&#xff0…

数据结构之树的性质总结

节点的度&#xff1a;该节点拥有的孩子个数 叶子节点&#xff1a;度为0的节点 层数&#xff1a;根节点为第一层&#xff0c;根的子节点为第二层&#xff0c;以此类推 所有树的性质&#xff1a;所有节点的总度数等于节点数减一 完全m叉树性质 完全m 叉树&#xff0c;节点的…

计算机专业,不擅长打代码,考研该怎么选择?

考研其实和你的代码能力关系不大 所以在选学校以前可以看看有哪些学校复试是要求上机撸代码的&#xff0c;可能会要求比较严 初试真的不用担心代码问题&#xff0c;我也是基本零编程能力就开始备考考研的... 本人双非科班出身备考408成功上岸&#xff0c;在这里也想给想考40…

Spark编程基础

一、RDD入门 1.RDD是什么&#xff1f; RDD是一个容错的、只读的、可进行并行操作的数据结构&#xff0c;是一个分布在集群各个节点中的存放元素的集合&#xff0c;即弹性分布式数据集。 2.RDD的三种创建方式 第一种是将程序中已存在的集合&#xff08;如集合、列表、数组&a…

若依二次开发总结

基于若依进行二次开发总结 后端启动 1.idea中打开项目 maven加载依赖 2.配置数据库&#xff0c;运行sql文件 3.配置yml文件 4.用命令redis-server启动redis 5.运行启动类&#xff0c;启动后端 前端启动 1.在vscode中打开文件夹ruoyi-ui 2.安装依赖 npm install3.启动前端 …