計算方法實驗六 數值積分

【實驗性質】綜合性實驗。

【實驗目的】理解插值型積分法;掌握復化積分法算法。?

【實驗內容】

1對 ,用復化梯形積分和變步長梯形積分求值(截斷誤差不超過)。

【理論基礎】

積分在工程中有重要的應用,數值積分的基本思想是用被積函在區間上的一些點處的值 的線性組合作為積分的近似值:

實際應用中 f x( )是未知的,一般用 f x( ) 的次數不超過n的插值多項式來代替(插值型求積方法):

【實驗過程】

1.用復化梯形積分求解,給出代碼,并用表格記載求解過程〔區間數n=30、50、70、100、150〕。

程序代碼:

頭文件:

#ifndef DEFINITEINTEGRAL_H

#define DEFINITEINTEGRAL_H

#include<math.h>

class definiteintegral

{

public:

??? definiteintegral();

??? double T_Integral(double a ,double b,double(*f)(double));

??? double S_Integral(double a ,double b,double(*f)(double));

??? double C_Integral(double a ,double b,double(*f)(double));

??? double Tn_Integral(double a ,double b,double(*f)(double),int n);

??? double Sn_Integral(double a ,double b,double(*f)(double),int n);

??? double Cn_Integral(double a ,double b,double(*f)(double),int n);

??? double V_T_Integral(double a, double b, double(*f)(double),double e);

};

#endif // DEFINITEINTEGRAL_H

主函數:

//實驗六

#include <iostream>

#include <windows.h>

#include "colvector.h"

#include "matrix.h"

#include <windows.h>

#include "linearequations.h"

#include "interpolationpolynomial.h"

#include "definiteintegral.h"

double f1(double x){

??? return x*x*x-sin(x)-4*x-1;

}

double f2(double x){

??? return 3*x*x-cos(x)-4;

}

double f3(double x){

??? double result =sin(x)+4*x-1;

??????? if(result>0){

??????????? return pow(result,1.0/3);

??????? }else{

???????????? return -pow(fabs(result),1.0/3);

??????? }

}

using namespace std;

double f4(double x)

{

??? return 1/(1+x*x);

}

int main()

{

??? SetConsoleOutputCP(CP_UTF8);

??? double a=0,b=1.0;

??? definiteintegral obj;

??? cout<<"梯形積分:\t\t"<<obj.T_Integral(a,b,f4)<<endl;

??? cout<<"Simpson積分:\t\t"<<obj.S_Integral(a,b,f4)<<endl;

??? cout<<"Cotess積分:\t\t"<<obj.C_Integral(a,b,f4)<<endl;

??? cout<<endl;

??? cout<<"復化梯形積分:\t\t"<<obj.Tn_Integral(a,b,f4,150)<<endl;

??? cout<<"復化Simpson積分:\t"<<obj.Sn_Integral(a,b,f4,30)<<endl;

??? cout<<"復化Cotes積分:\t\t"<<obj.Cn_Integral(a,b,f4,30)<<endl;

??? cout<<endl;

??? cout<<"交步長梯形積分:\t\t"<<obj.V_T_Integral(a,b,f4,0.00001)<<endl;

??? return 0;

}

代碼塊:

#include "definiteintegral.h"
definiteintegral::definiteintegral(){}
double definiteintegral::T_Integral(double a,double b,double(*f)(double)){
??? return (b-a)/2.0*(f(a)+f(b));
}
double definiteintegral::S_Integral(double a,double b,double(*f)(double)){
??? return (b-a)/6.0*(f(a)+4*f((a+b)/2)+f(b));
}
double definiteintegral::C_Integral(double a,double b,double(*f)(double)){
??? double h=(b-a)/4.0;
??? return (b-a)/90*(7*f(a)+32*f(a+h)+12*f(a+2*h)+32*f(a+3*h)+7*f(b));
}
double definiteintegral::Tn_Integral(double a,double b,double(*f)(double),int n){
??? double h=(b-a)/n;
??? double result =0;
??? double sum=0;
??? for(int i=1;i<=n-1;i++){
??????????? sum +=f(a+i*h);
??? }
??? result =h/2.0*(f(a)+2*sum+f(b));
??? return result;
}
double definiteintegral::Sn_Integral(double a,double b,double(*f)(double),int n){
??? double h=(b-a)/n;
??? double result =0;
??? double sum1=0,sum2=0;
??? for(int i=1;i<=n;i++){
??????????? sum1 +=f(a+(i-1)*h+h/2);
??? }
??? for(int i=1;i<=n-1;i++){
??????????? sum2 +=f(a+i*h);
??? }
??? result =h/6.0*(f(a)+4*sum1+2*sum2+f(b));
??? return result;
}
double definiteintegral::Cn_Integral(double a,double b,double(*f)(double),int n){
??? double h=(b-a)/n;
??? double result =0;
??? double sum1=0,sum2=0,sum3=0,sum4=0;
??? for(int i=1;i<=n;i++){
??????????? sum1 +=f(a+(i-1)*h+h/4);
??? }
??? for(int i=1;i<=n;i++){
??????????? sum2 +=f(a+(i-1)*h+h/2);
??? }
??? for(int i=1;i<=n;i++){
??????????? sum3 +=f(a+(i-1)*h+3*h/4);
??? }
??? for(int i=1;i<=n-1;i++){
??????????? sum4 +=f(a+i*h);
??? }
??? result =h/90.0*(7*f(a)+32*sum1+12*sum2+32*sum3+14*sum4+7*f(b));
??? return result;
}
 
double definiteintegral::V_T_Integral(double a, double b, double(*f)(double),double e){
 
??? double h=(b-a);
??? double T1=h/2.0*(f(a)+f(b));
??? double T2=T1/2.0+h/2.0*f(a+h/2.0);
??? double error=fabs(T2-T1);
??? while(error>=e){
??????? T1=T2;
??????? h=h/2;
??????? double x=a+h/2;
??????? double sum=0;
??????? while(x<b){
??????????? sum+=f(x);
??????????? x+=h;
??????? }
??????? T2=T1/2.0+h/2.0*sum;
??????? error=fabs(T2-T1);
??? }
??? return T2;
}
 

表格:

n=30
n=50
n=70
n=100
n=150
0.785352
0.785381
0.785390
0.785394
0.785396

?

2.用變步長梯形積分求解,給出代碼,并用表格記載求解過程。

代碼塊:

double definiteintegral::V_T_Integral(double a, double b, double(*f)(double),double e){
 
??? double h=(b-a);
??? double T1=h/2.0*(f(a)+f(b));
??? double T2=T1/2.0+h/2.0*f(a+h/2.0);
??? double error=fabs(T2-T1);
??? while(error>=e){
??????? T1=T2;
??????? h=h/2;
??????? double x=a+h/2;
??????? double sum=0;
??????? while(x<b){
??????????? sum+=f(x);
??????????? x+=h;
??????? }
??????? T2=T1/2.0+h/2.0*sum;
??????? error=fabs(T2-T1);
??? }
??? return T2;
}

表格:

3.比較復化積分與變步長積分,分析實驗出現的問題,總結解決辦法。

??? 復化積分是將一個區間分成若干子區間,然后在每個子區間上應用數值積分方法。它的優點是簡單易實現,計算結果比較穩定。但是,如果子區間的數量不夠多,或者函數在某些子區間上變化較大,可能會導致計算結果的誤差較大。為了解決這個問題,可以增加子區間的數量,或者使用自適應方法,根據函數的變化情況來調整子區間的數量。

變步長積分是根據函數的變化情況,調整積分步長來提高計算精度。它的優點是能夠更好地適應函數的變化情況,減小誤差。但是,如果調整步長的策略不合理,可能會導致計算時間過長。為了解決這個問題,可以采用適當的步長調整策略,如自適應選取步長或者根據函數的一階或二階導數來調整步長。

【實驗心得】

在本次實驗中,我們學習了三種數值積分的方法,包括差值積分法、復化積分法和復化梯形公式。通過這些實驗,我對數值積分的原理和計算方法有了更深入的了解。

在差值積分法中,我們使用了牛頓-科特斯公式對函數進行了差值,然后通過對差值多項式進行求和來計算積分。這種方法的優點是計算簡單,適用于低次多項式的積分,但對于高次多項式的積分誤差較大。

復化積分法是將計算區間分成若干小區間,然后對每個小區間應用數值積分方法。我們采用了復化梯形公式,其原理是通過將每個小區間近似為梯形來計算積分。這種方法誤差較差值積分法要小,但計算較復雜。

綜合考慮精度和計算復雜度,我們可以選擇合適的數值積分方法。如果函數是低次多項式,可以使用差值積分法進行計算。對于復雜函數,可以采用復化積分法進行分區間計算。通過這些實驗,我掌握了數值積分的基本原理和計算方法,并且了解了不同方法的優缺點,這對于解決實際問題具有重要的參考價值。

得??? 分_____________

?

評閱日期_____________

?

教師簽名_____________

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81748.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81748.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Webug4.0靶場通關筆記11- 第15關任意文件下載與第16關MySQL配置文件下載

目錄 一、文件下載 二、第15關 任意文件下載 1.打開靶場 2.源碼分析 3.滲透實戰 三、第16關 MySQL配置文件下載 1.打開靶場 2.源碼分析 3.滲透實戰 &#xff08;1&#xff09;Windows系統 &#xff08;2&#xff09;Linux系統 四、滲透防御 一、文件下載 本文通過…

小土堆pytorch--tensorboard的使用

小土堆pytorch--tensorboard的使用 小土堆pytorch--tensorboard的使用0.介紹1.使用tensorboard繪制 y x 等簡單函數1.1 相應的代碼1.2 對上述代碼的解釋1.3 可能遇到的問題1.3.1 問題1.3.2 解決方法 2.使用tensorboard加載數據集中的圖片2.1 相應代碼2.2 對上述代碼的解釋2.2.…

大模型(LLMs)RAG 版面分析——文本分塊面

大模型&#xff08;LLMs&#xff09;RAG 版面分析——文本分塊面 一、為什么需要對文本分塊&#xff1f; 二、能不能介紹一下常見的文本分塊方法&#xff1f; 2.1 一般的文本分塊方法 2.2 正則拆分的文本分塊方法 2.3 Spacy Text Splitter 方法 2.4 基于 langchain 的 Cha…

解構區塊鏈身份認證:從ID到零知識證明的實戰指南

引言 在數字經濟高速發展的今天&#xff0c;數字身份已成為個人與數字世界交互的核心憑證。傳統中心化身份系統存在數據孤島、隱私泄露、單點故障等痛點&#xff0c;而區塊鏈技術憑借??去中心化、不可篡改、可追溯??的特性&#xff0c;為數字身份驗證提供了革命性解決方案…

c#數據結構 線性表篇 非常用線性集合總結

本人能力有限,使用了一些Ai的結論,如有不足還請斧正 目錄 1.HashSet <> Dictionary 2.SortedSet <>提供升序方法的List 3.ArrayList<>List 4.BitArray <> Bit[] array 5.StringCollection <>List 6.StringDictionary<>Dictionary 1…

爬蟲管理平臺-最新版本發布

TaskPyro 是什么&#xff1f; TaskPyro 是一個輕量級的 Python 任務調度平臺&#xff0c;專注于提供簡單易用的任務管理和爬蟲調度解決方案。它能夠幫助您輕松管理和調度 Python 任務&#xff0c;特別適合需要定時執行的爬蟲任務和數據處理任務。 官方文檔&#xff1a;https:/…

過采樣處理

一、數據讀取與初步觀察 首先&#xff0c;使用pandas庫讀取信用卡交易數據集&#xff1a; data pd.read_csv(r"./creditcard.csv") print(data.head())通過head()方法查看數據集的前幾行&#xff0c;初步了解數據的結構和內容。該數據集包含交易時間、交易金額、多…

潮乎盲盒商城系統全開源多級分銷推廣海報獎品兌換試玩概率OSS云存儲多端源碼

一、源碼描述 這是一套潮乎盲盒商城源碼&#xff0c;仿小叮當盲盒商城&#xff0c;后端Laravel框架前端uniappvue&#xff0c;前后端數據庫分離&#xff0c;支持四端同步數據&#xff08;H5小程序等&#xff09;&#xff0c;測試環境: php7.4&#xff0c;mysql5.6&#xff0c;…

c++環境和vscode常用的一些有用插件

環境 WSL需要安裝cmake 編譯器g14 應該是包含了所有std:c23把好像包含部分c26 vscode 需要插件cmake vscode clangd 方便提示吧 File Watch 插件目的在保存.h/.cpp文件時候自動執行vscode 的cmake吧 error lens 方便每次顯示錯誤和警告的提示懶得每次點擊去看錯誤 Edit Sugge…

Spring 轉發 form-data 文件上傳請求時中文文件名亂碼

Spring 轉發 form-data 文件上傳請求時中文文件名亂碼 復現問題找原因解決問題參考 復現問題 后端有兩個接口&#xff1a; /upload 是文件上傳的接口。 /forward 是轉發文件上傳請求的接口。 RequestMapping RestController public class FileUploadController {/*** 直接調…

MySQL 8.4.4 安全升級指南:從漏洞修復到版本升級全流程解析

目錄 二、升級前關鍵注意事項 1. 數據安全與備份 2. 版本兼容性與路徑規劃 三、分步升級操作流程 1. 環境預檢與準備 2. 安裝包部署 3. 強制升級組件 4. 驗證與啟動 一、背景與必要性 近期安全掃描發現生產環境的 MySQL 數據庫存在多個高危漏洞(CVE 詳情參見Oracle 官…

vulkanscenegraph顯示傾斜模型(6.4)-多線程下的記錄與提交

前言 上章深入分析了幀循環中呈現階段的具體實現。本章將分析多線程下的記錄與提交&#xff0c;進一步剖析vsg幀循環過程中的同步機制&#xff0c;并揭露信號量(VkSemaphore)和圍欄(VkFence)以及vsg::FrameBlock與vsg::Barrier在其中的作用。 目錄 1 信號量(VkSemaphore)、柵欄…

Python爬蟲實戰:獲取扇貝單詞數據并分析,為用戶高效學習單詞做參考

一、引言 隨著互聯網的迅猛發展,在線學習資源日益豐富多樣。扇貝單詞作為一款備受歡迎的在線英語學習平臺,積累了海量的單詞學習數據。借助 Python 強大的爬蟲技術獲取這些數據,并運用數據分析和機器學習方法進行深度挖掘,能夠為用戶量身定制更個性化、更高效的單詞學習方…

【Vagrant+VirtualBox創建自動化虛擬環境】Ansible-Playbook

Vagrant 后續Ansible實戰&#xff1a;【Ansible自動化運維實戰&#xff1a;從Playbook到負載均衡指南】-CSDN博客 Vagrant是一個基于Ruby的工具&#xff0c;用于創建和部署虛擬化開發環境。它使用Oracle的開源VirtualBox虛擬化系統&#xff0c;使用 Chef創建自動化虛擬環境 Do…

Codigger Desktop:重新定義數字工作與生活方式

Codigger Desktop是一款革命性的智能桌面操作系統&#xff0c;專為現代數字生活和工作場景打造。它不僅成為開發者的強大生產力工具&#xff0c;更是普通用戶日常數字生活的得力助手&#xff0c;完美實現了專業性與易用性的平衡。 Multimedia Desktop全能數字生活平臺 重新定…

Servlet+tomcat

serverlet 定義&#xff1a;是一個接口&#xff0c;定義了java類被瀏覽器&#xff08;tomcat識別&#xff09;的規則 所以我們需要自定義一個類&#xff0c;實現severlet接口復寫方法 通過配置類實現路徑和servlet的對應關系 執行原理 當用戶在瀏覽器輸入路徑&#xff0c;會…

什么是 DDoS 攻擊?高防 IP 如何有效防護?2025全面解析與方案推薦

一、DDoS 攻擊&#xff1a;互聯網時代的 “數字核武器” 1. DDoS 攻擊的本質與原理 ** 分布式拒絕服務攻擊&#xff08;DDoS&#xff09;** 通過操控海量僵尸設備&#xff0c;向目標服務器發送洪水般請求&#xff0c;耗盡帶寬、連接或計算資源&#xff0c;導致合法用戶無法訪…

Circular Plot系列(一): 環形熱圖繪制

針對近期多個粉絲咨詢環形圖的繪制&#xff0c;我意識到&#xff0c;我們似乎沒有真正介紹過circle圖&#xff0c;但這一類圖確是非常常用的圖&#xff0c;所以這里詳細學習一下circle的繪制&#xff0c;使用的是circlize包&#xff0c;功能很完善&#xff1a;安裝包, #https:/…

【數據挖掘】時間序列預測-時間序列預測策略

時間序列預測策略 &#xff08;1&#xff09;單步預測與多步預測&#xff08;2&#xff09;直接多步預測&#xff08;3&#xff09;遞歸多步預測&#xff08;4&#xff09;直接遞歸的混合預測&#xff08;5&#xff09;多輸入多輸出預測 &#xff08;1&#xff09;單步預測與多…

【LLM】deepseek R1之GRPO訓練筆記(持續更新)

note 相關框架對比&#xff1a; 需微調模型且資源有限 → Unsloth&#xff1b;本地隱私優先的小規模推理 → Ollama&#xff1b;復雜邏輯或多模態任務 → SGLang&#xff1b;高并發生產環境 → vLLM 微調SFT和GRPO是確實能學到新知識的四種格式&#xff08;messages、sharegpt…