Matlab:非线性热传导(抛物方程)问题


函数文件1:real_fun.m
function f=real_fun(x0,t0)
%精确解
f=4*x0*(1-x0)*sin(t0);
函数文件2:F.m
function f=F(N,u,U,t,h1,h2)
%非线性方程组
%h1是x的步长,h2是t的步长
%u表示迭代节点,上一时刻的数值解
%h表示时间节点上的步长
%N表示空间节点的步数
a0=0.5*t^4*h2*N^2;
f(1,1)=a0*(U(2)^2-2*U(1)^2)+h2*fi(h1,t)+u(1)-U(1);
f(N-1,1)=a0*(-2*U(N-1)^2+U(N-2)^2)+h2*fi((N-1)*h1,t)+u(N-1)-U(N-1);
for p=2:N-2
f(p,1)=a0*(U(p+1)^2-2*U(p)^2+U(p-1)^2)+h2*fi(p*h1,t)+u(p)-U(p);
end
函数文件3:fi.m
function f=fi(x0,t0)
%等式右边的f函数
f=4*x0*(1-x0)*cos(t0)-16*t0^4*(6*x0^2-6*x0+1)*(sin(t0))^2;
函数文件4:Jacobian.m
function g=Jacobian(n,u,t,h1,h2)
%计算每个时间节点的牛顿迭代过程中的雅可比矩阵
%u表示迭代初值,上一时刻的数值解作为迭代初值
a=0.5*t^4*h2*n^2;
g=zeros(n-1);
g(1,2)=2*a*u(2);
g(1,1)=-4*a*u(1);
g(n-1,n-1)=-4*a*u(n-1);
g(n-1,n-2)=2*a*u(n-2);
for p=2:n-2
g(p,p+1)=2*a*u(p+1);
g(p,p)=-4*a*u(p);
g(p,p-1)=2*a*u(p-1);
end
g=g-eye(n-1);
函数文件5:Newtond.m
function x=Newtond(n,u,t,h1,h2)
%使用修改后的牛顿迭代,可以不求雅可比de逆
%U中间代初值
%u起始迭代初值
U=u;
tol=0.5e-5;
% Jacobi=Jacobian(n,u,t,h1,h2);%每隔k步求一次雅可比
x1=U-Jacobian(n,u,t,h1,h2)\F(n,u,U,t,h1,h2);
while (norm(x1-U,1)>=tol)
%数值解的1范数是否在误差范围内
U=x1;
x1=U-Jacobian(n,u,t,h1,h2)\F(n,u,U,t,h1,h2);
end
x=x1;%不动点
脚本文件:
tic;
clc
clear
N=100;
M=1000;
t_h=1/M;%t的步长
x_h=1/N;%x的步长
x=0:x_h:1;%x的节点
ti=0:t_h:0.5;%t的节点
%********************真解**************************
for i=1:length(x)
for j=1:length(ti)
real_Z(i,j)=real_fun(x(i),ti(j));
end
end
%********************真解**************************
%********************数值解**************************
ui=zeros(length(x)-2,1);%牛顿迭代初值
Z=zeros(length(x),length(ti));
for i=1:length(ti)-1
Z(2:length(x)-1,i+1)=Newtond(length(x)-1,ui,ti(i+1),x_h,t_h);%t(i+1)时间的牛顿数值解
ui=Z(2:length(x)-1,i+1);%牛顿迭代初值,上一时刻的数值解作为迭代初值
end %********************数值解**************************
[X,Y]=meshgrid(x,ti);
subplot(2,2,1),
mesh(X,Y,real_Z');
xlabel('x');ylabel('t');zlabel('u');title('analytical solution');
subplot(2,2,2),
mesh(X,Y,Z');
xlabel('x');ylabel('t');zlabel('u');title('numerical solution');
subplot(2,2,3),
mesh(X,Y,real_Z'-Z');
xlabel('x');ylabel('t');zlabel('u');title('error solution');
title('牛顿迭代法');
grid on;
toc;
效果图:

Matlab:非线性热传导(抛物方程)问题的更多相关文章
- Matlab:线性热传导(抛物线方程)问题
函数文件1:real_fun.m function f=real_fun(x0,t0) f=(x0-x0^2)*exp(-t0); 函数文件2:fun.m function f=fun(x0,t0) ...
- MATLAB 符号变量表达式 + 方程求解
源代码见文末 部分源代码: % 符号变量 两种表达方式 a=sym('a'); class(a); syms b; b; % 符号常量 c=sym('); c; % 符号表达式 三种表达方式 f1=' ...
- Matlab:非线性高阶常微分方程的几种解法
一.隐式Euler: 函数文件1: function b=F(t,x0,u,h) b(,)=x0()-h*x0()-u(); b(,)=x0()+*h*x0()/t+*h*(*exp(x0())+ex ...
- hdu3483 A Very Simple Problem 非线性递推方程2 矩阵快速幂
题目传送门 题目描述:给出n,x,mod.求s[n]. s[n]=s[n-1]+(x^n)*(n^x)%mod; 思路:这道题是hdu5950的进阶版.大家可以看这篇博客hdu5950题解. 由于n很 ...
- matlab 万能实用的非线性曲线拟合方法
——转载网络 在科学计算和工程应用中,经常会遇到需要拟合一系列的离散数据,最近找了很多相关的文章方法,在这里进行总结一下其中最完整.几乎能解决所有离散参数非线性拟合的方法 第一步:得到散点数据 根据你 ...
- PDE工具箱的简单使用
转载自Here matlab的PDE工具箱的简单使用 问题选择 边界条件选择 菜单按钮和简单使用 命令行输入pdetool,打开GUI编辑界面如下: 注意到工具栏上,就是我们要用到的,从左到右依次使用 ...
- Python数据预处理—归一化,标准化,正则化
关于数据预处理的几个概念 归一化 (Normalization): 属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现. 常用的 ...
- Scipy-数值计算库
Scipy在Numpy的基础上则加了众多的数学计算,科学计算以及工程计算中常用的模块,例如线性代数,常微分方程的数值求解,信号处理,图像处理,系数矩阵等.在本章中,将通过实例介绍Scipy中常用的的一 ...
- Python数据预处理(sklearn.preprocessing)—归一化(MinMaxScaler),标准化(StandardScaler),正则化(Normalizer, normalize)
关于数据预处理的几个概念 归一化 (Normalization): 属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现. 常 ...
随机推荐
- 关于COM类工厂80070005和8000401a错误分析及解决办法
关于COM类工厂80070005和8000401a错误分析及解决办法 看到很多相关的文章,第一次配置配置时没有啥作用,让别人来解决的,可惜不晓得他怎么解决的,当我再次遇到时,不得不硬着头皮去解决. 总 ...
- Asp.Net 之 OnClientClick 与 OnClick 的执行顺序
Asp.net 中 OnClientClick 与 OnClick 的执行顺序为:客户端的OnClientClick先执行,服务器端的OnClick后执行. 拓展:在执行完客户端的OnClientCl ...
- GC 垃圾收集
算法: 没有使用引用计数算法.使用的是GC Roots 可达性算法. 复制算法:新生代,老年代. 标记-整理算法:一般会对对象标记几次才会清理掉.然后从新整理物理内存空间. 分代收集算法:更加对象存活 ...
- 【译】第13节---数据注解-Required
原文:http://www.entityframeworktutorial.net/code-first/required-attribute-dataannotations-in-code-firs ...
- WebBrowser获取完整COOKIE
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool ...
- Unicode转字符串
/// <summary> /// Unicode转字符串 /// </summary> /// <returns>The to string.</retur ...
- intellij idea 破解教程
首先呼吁:抵制盗版,抵制盗版,抵制盗版 如果只是个人开发学习用,那么下面的教程可能比较适合你了 有两种方法,第一种:Activate--License server,在License server a ...
- python 启动新进程执行脚本
import subprocess p_restart=subprocess.Popen(['/bin/sh','/etc/init.d/xxx_service','reboot'])
- 【转】构造自己的DIB类
ZC: 搜索"DIB_HEADER_MARKER"时,看到的这个文章 http://blog.csdn.net/yyyuhan/article/details/2026652 ...
- java.io.FileNotFoundException异常,一是“拒绝访问”,二是“系统找不到指定路径”
关于java.io.FileNotFoundException异常 因为这个异常抛出俩种情况:一是“拒绝访问”,二是“系统找不到指定路径” 这里只讲明什么时候抛拒绝访问,什么时候抛找不到指定路径. 原 ...