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类实现. 常 ...
随机推荐
- 论文笔记:Learning Dynamic Memory Networks for Object Tracking
Learning Dynamic Memory Networks for Object Tracking ECCV 2018Updated on 2018-08-05 16:36:30 Paper: ...
- Dockerize a .NET Core application
Dockerize a .NET Core application Introduction This example demonstrates how to dockerize an ASP.NET ...
- Docker:Deploy your app
Prerequisites Install Docker. Get Docker Compose as described in Part 3 prerequisites. Get Docker Ma ...
- 51Nod—1174 区间中最大的数 线段树模版
在大佬们题解的帮助下算是看懂了线段树吧...在这mark下防一手转头就忘. #include<iostream> #include<stdio.h> using namespa ...
- java.lang.NoClassDefFoundError: com/gexin/rp/sdk/exceptions/RequestException解决方法
本文为博主原创,未经允许不得转载: 最近在开发个推的时候遇到的问题,当我在maven仓库中下载个推的jar包时,下载不下来,索性在项目中Configue build Path,将jar下载到本地 手动 ...
- HttpDns原理
什么是 DNS DNS(Domain Name System,域名系统),DNS 服务用于在网络请求时,将域名转为 IP 地址.能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数 ...
- RN 实现简易浏览器
import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View, Dimensions, ...
- Redux基础使用
Redux基础使用: 简介:这里是从需求来响应的执行操作redux,所以理解起来更加的容易铭记在心的三点:action/reducer/store 除此之外就是react/react native的基 ...
- chrome浏览器的SwitchyOmega插件使用方法
对于有某些特殊需求的人来讲,应该对这个插件不陌生,但是很多人不了解这插件的工作原理,百度的老教程又很烂,在刚开始用的时候我也不知道怎么办,去百度搜出来的教程基本都是让下载个规则文件让你去导入,但一般这 ...
- Jmeter干货 不常用却极其有用的几个地方
1. Jmeter测试计划下Run Thread Groups consecutively 表示序列化执行测试计划下所有线程组中的各个请求 如下图配置,新建的测试计划中,不默认勾选此项, 而享用Jme ...