问题一:

$$\frac{d^2u}{dx^2}=f(x)$$

边界条件:$$u(a)=u(b)=0$$,

精确解为:$$u=x^4-1$$

运用Galerkin方法建立有限元方程(其过程可参考《微分方程数值解法》李荣华第四版,P226)

下面直接上代码:

# -*- coding: utf-8 -*-
"""
Created on Wed Jun  6 21:04:25 2018@author: shaowuGalerkin有限元法求解两边值问题,方程形式:
p*u''=f(u,x),u(a)=0,u(b)=0或u'(b)=0
其双线性形式为a(u,v)=p*u'*v'的一重积分
"""
import numpy as np
import pandas as pd
import scipy as sp
import numpy.linalg as LA
import matplotlib.pyplot as plt
from scipy.special.orthogonal import p_roots
import time
start_time=time.time()
def gauss_xw(m=100):"""默认用100个点求高斯——勒让德节点point和权weight,并返回"""point,weight=p_roots(m+1)return point,weightdef function_u(x):"""精确解"""return x**4-1def f_function(x):"""定义方程右端函数"""return 12*x**2def hat_function(x,t,i,h,n):#构造试探函数空间的一组基函数:线性插值公式构造如下#参数:h 步长列表#t 节点列表#i 第i个节点#n 节点个数#x 变量if i==n:if t[n]>=x and x>=t[n-1]:return 1+(x-t[n])/h[n-1]else:return 0else:if t[i]>=x and x>=t[i-1]:return 1+(x-t[i])/h[i-1]elif t[i+1]>=x and x>=t[i]:return 1-(x-t[i])/h[i]else:return 0def compute_right_of_equation(point,weight,t,h,n,a,b):"""计算方程的右端项参数:h 步长列表a,b 对应区间[a,b]"""#return [sp.integrate.quad(lambda x: f_function(x)*hat_function(x,t,j,h,n),t[j-1],t[j])[0]+\#        sp.integrate.quad(lambda x: f_function(x)*hat_function(x,t,j,h,n),t[j],t[j+1])[0] for \#        j in range(1,n)]+[sp.integrate.quad(lambda x: f_function(x)*hat_function(x,t,n,h,n),t[n-1],t[n])[0]]c=(b-a)/2s=(b-a)/2*point+(a+b)/2 #把区间[a,b]变化到[-1,1]return [sum([c*weight[i]*f_function(s[i])*hat_function(s[i],t,j,h,n) for i in range(len(s))])for j in range(1,len(t)-1)]
def compute_stiffness_matrix(point,weight,t,h,n,a,b):"""计算系数矩阵,即总的刚度矩阵"""#c=(b-a)/2#s=(b-a)/2*point+(a+b)/2 #把区间[a,b]变化到[-1,1]"""A=[]for j in range(len(t)):A.append([sum([c*weight[k]*hat_function(s[k],t,i,h,n)*hat_function(s[k],t,j,h,n) for k in range(len(s))])for i in range(len(t))])"""A=np.zeros((n-1,n-1))for j in range(1,len(t)-1):if j==1:A[j-1,j-1]=+sp.integrate.quad(lambda x: h[j]**(-2),t[j-1],t[j+1])[0]#sp.integrate.quad(lambda x: h[j]**(-2),t[j],t[j+1])[0]A[j-1,j]=sp.integrate.quad(lambda x: -h[j]**(-2),t[j],t[j+1])[0]#A[j,j-1]=sp.integrate.quad(lambda x: h[j]**(-2),t[j-1],t[j])[0]elif j==n-1:A[j-1,j-2]=sp.integrate.quad(lambda x: -h[j-1]**(-2),t[j-1],t[j])[0]A[j-1,j-1]=+sp.integrate.quad(lambda x: h[j-1]**(-2),t[j-1],t[j+1])[0]else:A[j-1,j-2]=sp.integrate.quad(lambda x: -h[j-1]**(-2),t[j-1],t[j])[0]A[j-1,j-1]=+sp.integrate.quad(lambda x: h[j-1]**(-2),t[j-1],t[j])[0]+\sp.integrate.quad(lambda x: h[j]**(-2),t[j],t[j+1])[0]A[j-1,j]=sp.integrate.quad(lambda x: -h[j]**(-2),t[j],t[j+1])[0]return np.array(A)def solve_ui(A,b):"""计算ui"""return np.linalg.solve(A,-np.array(b))
def solve_uh(ui,t,h,n,a,b):"""计算uh和误差"""uh=[sum([ui[j]*hat_function(x,t,j+1,h,n) for j in range(n-1)]) for x in t]error=function_u(np.array(t))-uh#print(LA.norm(error,np.inf))return uh,LA.norm(error,np.inf)
if __name__ == '__main__':a=-1 #区间a,bb=1n=20h=(b-a)/(n) #等距步长t=[a+i*h for i in range(0,n+1)] #节点h=[(b-a)/(n) for i in range(n)] #子区间步长集合point,weight=gauss_xw(m=100) #高斯勒让德节点point和权weightf=compute_right_of_equation(point,weight,t,h,n,a,b) #计算方程右端项A=compute_stiffness_matrix(point,weight,t,h,n,a,b) #计算系数矩阵,即总刚度矩阵ui=solve_ui(A,f) #计算uiuh,error=solve_uh(ui,t,h,n,a,b) #计算uh和误差print('the error is:',error)plt.plot(t,[0]+list(ui)+[0],'+b',label='approximate solution')plt.plot(t,function_u(np.array(t)),'r',label='exact solution')plt.title('Fig1.(where a=-1,b=1,n=20,$u(x)=x^4-1$,$u(-1)=u(1)=0$)')plt.xlabel('x')plt.ylabel('u')plt.legend(loc='upper center')print('all cost time:',time.time()-start_time)

运行结果:

the error is: 0.000169677784248

all cost time: 0.3332369327545166

如有疑问,欢迎提问。。。

有限元求解两点边值问题之一相关推荐

  1. 有限元求解两点边值问题之二

    问题:$$-\frac{d^2u}{dx^2}=f(x)$$ 边值条件为$$u(a)=0,u(b)=1$$, 精确解为$$u=x^{\frac{3}{4}}$$ 其Galerkin推导有限元方程的过程 ...

  2. matlab 读取图片后分区域编号_你的第一个有限元求解器——仅十行MATLAB代码

    有限元分析话题中有不少讨论有限元求解器的问题,但大都停留在概念层面,未见实际代码.望本文能略起抛砖引玉之作用. 以下代码是基于MATLAB编写. 问题描述 考虑一平面有界区域 ,设其边界为 .我们求解 ...

  3. 【微分方程数值解】有限差分法(二)两点边值问题数值算例(附python代码)

    1.两点边值问题形式 一般的两点边值问题形式为: −uxx=f(x)-u_{xx}=f(x)−uxx​=f(x) u(a)=α,u(b)=βu(a)=\alpha,u(b)=\betau(a)=α,u ...

  4. 有限差分法matlab两点边值代码,两点边值问题的有限差分法.doc

    两点边值问题的有限差分法.doc 学生实验报告实验课程名称偏微分方程数值解开课实验室数统学院学院数统年级2013专业班信计2班学生姓名学号开课时间2015至2016学年第2学期总成绩教师签名数学与统计 ...

  5. matlab微分方程组边值,matlab求解常微分方程边值问题的方法

    matlab求解常微分方程边值问题的方法 Matlab 求解常微分方程边值问题的方法:bvp4c 函数 常微分方程的边值问题,即 boundary value problems ,简称 BVP 问题, ...

  6. python有限元传热求解_二维稳态热传导基本方程的有限元求解(2)

    四节点矩形单元 在二维稳态热传导基本方程的有限元求解(1)这篇文章中,我们仅仅给出了有限元单元方程的一种比较标准的推导步骤,并未涉及某种具体的单元.且在式(20)中,单元 上温度 的近似函数表示成节点 ...

  7. 变分法求解两点间直线距离最短

    变分法求解两点间直线距离最短,问题很小,意义很大.

  8. 洛谷题库P5735距离函数C语言,扩展有限元求解弱不连续问题..docx

    扩展有限元求解弱不连续问题. 扩展有限元求解弱不连续问题数学计算机学院 信息与计算科学专业 2011届 段斯琦摘要:扩展有限元 ( XFEM ) 是在标准有限元的框架下,提出来的一种有利于解决裂纹.孔 ...

  9. matlab计算应力位移,2012年-有限元作业-matlab编程实现有限元求解简单结构位移及应力.doc...

    <2012年-有限元作业-matlab编程实现有限元求解简单结构位移及应力.doc>由会员分享,可在线阅读,更多相关<2012年-有限元作业-matlab编程实现有限元求解简单结构位 ...

最新文章

  1. php上传漏洞绕过gd库,jQuery File Upload任意文件上传漏洞
  2. ansys18安装以后打不开_Ubuntu18.04安装Python各个版本之后导致终端无法打开的解决办法...
  3. Openstack 中的消息总线 AMQP
  4. 厉害了,我的Python,竟然可以这么玩儿......(内含福利)
  5. Python中生成一个指定长度的随机字符串实现示例
  6. CodeForces - 1350B Orac and Models(dp)
  7. Python装饰器学习(九步入门)
  8. 真正的男人要勇于承担责任......
  9. Java常用接口与类——Math类、Random类、BigDecimal类
  10. python怎么汇总数据_如何在Pandas Python中汇总数据?
  11. 软件工程作业团队作业No.5
  12. 敏感词过滤算法Aho-Corasick
  13. 杭电数据结构课程实践-哈密顿图的判断
  14. rk3568 LTE(N720)
  15. tablelayout +viewpage+Fragment
  16. POJ-Bound Found | 尺取法+绝对值特性
  17. excel poi 实现图片导出
  18. 【程序员如何买基金 一】基金的优势及分类
  19. 信用修复的社会意义及基本概念、要素?
  20. 一个07年毕业研究生的坎坷经历(上)

热门文章

  1. 解决:JDK安装下一步没反应,JDK安装失败
  2. 电脑操作:把文件上传到kindle,kindle上传文件 ,upload文件到kindle
  3. pygame小项目 ~ 2 :Python完成简易乒乓球游戏
  4. 资料链接--韦东山和尚观
  5. 靠手机软件免流是真的吗?什么原理?
  6. 【方向盘】IDEA的代码审查能力,来保证代码质量
  7. 4 年前端狗,2 年 CTO
  8. 知识变现海哥:卖课绝学,这招值得你每天看一篇
  9. 【CSS】文字溢出问题 ( 强制文本在一行中显示 | 隐藏文本的超出部分 | 使用省略号代替文本超出部分 )
  10. 中国智能家居设备市场规模调研及投资方向建议报告2022-2028年